为什么 javascript 会自动用未定义的条目填充 this.objects 数组?
事实并非如此,但看起来可能是这样。 :-)
关键是您要像这样设置数组条目:
this.objects[ objects[ i ].id ] = objects[ i ];
……显然,objects[ i ].id
有时大于数组中的条目数。
标准 JavaScript 数组根本不是一个真正的数组 http://blog.niftysnippets.org/2011/01/myth-of-arrays.html(除非由 JavaScript 引擎优化),1 它是一个对一些事情进行特殊处理的对象。
让我们举一个更简单的例子:
var a = []; // An empty array
console.log(a.length); // 0
a[3] = "foo"; // Puts an entry at index 3
console.log(a.length); // 4
正如您所看到的,如果您写入超出数组末尾的数组条目,则length
数组的索引被调整为比您写入的索引高1。
但是 JavaScript 不会用以下命令“填充”数组undefined
;该数组是sparse https://en.wikipedia.org/wiki/Sparse_matrix。条目位于a[0]
, a[1]
, and a[2]
不存在:
console.log(1 in a); // false
但是如果你向数组询问不存在的条目,你会得到undefined
:
console.log(a[1]); // undefined
...就像您在请求不存在的属性时对任何其他 JavaScript 对象所做的那样(因为数组“元素”实际上是对象属性,而数组“索引”实际上是属性名称)。
That's 不同的来自实际存在的具有该值的条目undefined
,这也是可能的:
a[1] = undefined;
console.log(1 in a); // true
console.log(a[1]); // undefined
所以 Mustache 正在循环遍历数组0
to length - 1
并询问条目,其中一些条目不存在,导致undefined
.
这是上面各种代码片段的可运行版本:
var a = []; // An empty array
console.log(a.length); // 0
a[3] = "foo"; // Puts an entry at index 3
console.log(a.length); // 4
console.log(1 in a); // false
console.log(a[1]); // undefined
a[1] = undefined;
console.log(1 in a); // true
console.log(a[1]); // undefined
这是一个很长的说法,您可能需要将该行更改为:
this.objects.push(objects[ i ]);
1 这是我乏味的旧博客上的一篇文章。