@user1689607 的评论在我看来就是答案。当您选择 时no lib (pure JS)
,您的代码不会记录任何undefined
值。问题是:库经常摆弄本机类型的原型。这样做最臭名昭著的库是prototype.js
(线索在名称中)。例如,常规、未更改对象的“神奇属性”Array
是不可枚举的(即:不会出现在for...in
数组的循环中)。但是,当您开始添加自己的属性和方法时,它们很可能会出现。由于Array
是从原型派生的,因此对该Object
原型的任何更改也可能会出现。
它的长短是:永远不要在数组上使用。for...in
如果您确实使用for...in
(在对象上),请始终检查您正在处理的任何属性是否直接设置在该对象上,并且不是来自原型:
for (var prop in someObject)
{
if (someObject.hasOwnProperty(prop))
{
//do stuff
}
}
就数组而言:for(var i=0;i<theArray.length;i++)
应该可以帮助您避开大多数问题(请记住,数组在 JS 中是稀疏的):
var normalArray = [1,2];
var sparseArray = [1,2,3,4];
delete sparseArray[2];//will log [1,2,undefined,4]
for (var i=0;i<sparseArray.length;i++)
{
if (i < normalArray.length)
{
console.log(normalArray[i]);
}
console.log(sparseArray[i]);//will log 1 - 2 - undefined - 4
if (sparseArray.hasOwnProperty(i))
{
console.log(sparseArray[i]);//logs 1 - 2 - 4
}
}