2016-12-31 14 views
-2

listTodos()関数では、ループのプレースホルダー引数iが配列のインデックス番号を吐き出す方法/理由がわかりません。私には、プレースホルダ/引数の両方が同じことをするように思われます。なぜなら、それらがどのように指定されているか把握できないからです。Javascript配列と.forEachループ引数

以下の理由で、コンソールにログが記録されない理由を理解できません。"Buy New Turtle: Buy New Turtle""0: Buy New Turtle"。ここで

todos.forEach(function(todo, i) { 
 
console.log(i + ": " + todo);

全体の "藤堂リスト" JSコードです:

var todos = ["Buy New Turtle"]; 
 

 
var input = prompt("What would you like to do?"); 
 

 
while(input !== "quit") { 
 
    if(input === "list") { 
 
    \t listTodos(); 
 
    } 
 
    else if(input === "new") { 
 
\t addTodo(); 
 
    } 
 
    else if(input === "delete") { 
 
    \t deleteTodo(); 
 
    } 
 
    input = prompt("What would you like to do?"); 
 
} 
 
console.log("OK YOU QUIT THE APP"); 
 

 
function listTodos() { 
 
\t console.log("**********") 
 
    \t todos.forEach(function(todo, i) { 
 
\t console.log(i + ": " + todo); 
 
    }); 
 
    console.log("**********"); 
 
} 
 

 
function addTodo() { 
 
\t var newTodo = prompt("Enter new todo"); 
 
\t todos.push(newTodo); 
 
\t console.log("Added Todo"); 
 
} 
 

 
function deleteTodo() { 
 
\t var index = prompt("Enter Index of Todo to Delete"); 
 
    \t todos.splice(index, 1); 
 
    \t console.log("Deleted Todo"); 
 
}

だから... ...私はここに何の意味もいるのでしょうか?誰かが私のためにこれをクリアすることはできますか?ありがとう!

+2

'.forEach()'コールバックに渡される第2引数はインデックスです。最初の引数は配列の値です。配列自体も3番目のパラメータとして渡します。 – Pointy

+3

* "todos.forEachループのi個のプレースホルダ引数が配列のインデックス番号を吐き出す方法/理由を理解できません" *これはforEachがどのように設計されたかの理由によるものです。あなたはそれについて他に何を知りたいですか? –

+1

[これは '.forEach()'のMDNページです。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) – Pointy

答えて

3

あなたは引数として関数をforEachに渡しています。 forEachはループ内で配列を反復し、その関数を特定の引数を渡して呼び出します。渡される引数は常にループ

  • ループ
  • 元の配列の現在のインデックスに現在の項目...

    1. になります。

      Array.prototype.mySuperForEach = function(callback) { 
       
          for (var i = 0; i < this.length; i++) { 
       
          callback(this[i], i, this) // <---This is your function being invoked 
       
          } 
       
      }; 
       
      
       
      ["foo", "bar", "baz"].mySuperForEach(function(item, i, arr) { 
       
          console.log("%s: %d of %d", item, i, arr.length) 
       
      })

      これは.forEach()の完全準拠した実装ではありませんが、それは基本的な考え方を与える:


    がより明確にこれを理解し、独自の機能イテレータを実装するには何が起こっているのかforループの内部では、コールバックが呼び出され、元の例で確認した引数が渡されます。


    私はArray.prototypeを拡張しながら、あなたはその波及効果を理解完全せずにこれを行うべきではないことに注意してください。

  • 関連する問題