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->console 中,它显示:

window.onload load 1372646227664 [undefined, 1372646227664] 1372646227664

问题:

  1. 对于window.tdiff->[undefined, 1372646227664],为什么不:[],因为当运行到 code: 时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
  1. 因为数组是一个复杂的javascript类型并且它的值是通过引用传递的,所以你在控制台中有一个[],但是在几毫秒之后,的空数组被替换为新值。如果您将使用 window.tdiff.slice(),您将在控制台中获得一个空数组(因为 slice 创建了一个新的数组副本,并带有一个新的引用)
  2. 减少回调只是不以未定义(未初始化或未初始化)值运行。在您的情况下,reduce 只返回第二个值。要查看它是如何工作的,请通过此链接使用 MDN 降低兼容性部分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它在调用之前填充数组的第二个元素console.log
  2. 来自文档:reduce对数组中存在的每个元素执行一次回调函数,不包括数组中的孔(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce )
于 2013-07-01T03:40:30.250 回答
0

从文档中, reduce排除了数组中的孔,并且由于您的数组只有一个元素,因此它作为 reduce 的结果返回

于 2013-07-01T03:42:03.690 回答