0
<body>  
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.onload = function(e){ 
    console.log("window.onload", e, Date.now() ,window.tdiff, 
    (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) ); 
}
</script> 
</body> 

上記のコードはサイトから取得したものです。

firefox->コンソールでは、次のように表示されます。

window.onload load 1372646227664 [undefined, 1372646227664] 1372646227664

質問:

  1. の場合、コード: を実行すると、それはまだ空の配列なのでwindow.tdiff->[undefined, 1372646227664]、なぜではありませんか?[]window.tdiff

  2. 、、、window.tdiff.reduce(fred)->1372646227664のはずなのにwindow.tdiff = [undefined, 1372646227664]、なぜ表示されるのですか?undefined - 1372646227664NaN1372646227664

4

4 に答える 4

1

window.tdiff->[undefined, 1372646227664] の場合、[] を実行しない理由はありません。なぜなら、code:window.tdiff を実行すると、まだ空の配列だからです。

これは空の配列ではありません。code:window.tdiff と言うと、メソッドにパラメーターとして渡されたポイントを参照しますが、console.log 関数が渡された値を評価するまでには、もはや次のパラメーターによって埋められているため、空の配列。

> (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) )

Arun P Johny による他の回答で指摘されているように、reduce は未定義の要素に fred() を適用していないため、NaN を取得できません。

于 2013-07-01T03:52:40.527 に答える
0

ドキュメントからreduceは配列の穴を除外します。配列には要素が 1 つしかないため、reduce の結果としてそれが返されます。

于 2013-07-01T03:42:03.690 に答える
0
  1. 配列は複雑な JavaScript 型であり、その値は参照によって渡されるため、コンソールに [] がありますが、window.tdiff[1] = Date.now()の後、数ミリ秒の間、空の配列が新しい値に置き換えられます。window.tdiff.slice() を使用すると、コンソールに空の配列が表示されます (slice は配列の新しいコピーを新しい参照で作成するため)
  2. コールバックを未定義 (初期化されていない、または初期化されていない) 値で実行しないようにします。あなたの場合、reduce は 2 番目の値を返すだけです。それがどのように機能するかを確認するには、このリンクの MDN Reduce 互換性セクションを使用します https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

PS console.log を fred に追加すると、呼び出されないことがわかります

于 2013-07-01T03:35:14.667 に答える
0
  1. diffを呼び出す前に、配列の 2 番目の要素を埋めconsole.logます。
  2. ドキュメントから:reduce配列内の穴を除いて、配列内に存在する各要素に対してコールバック関数を 1 回実行します ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce )
于 2013-07-01T03:40:30.250 に答える