根据您对另一个答案的评论,看起来您想要最短的方法。那么,您可以考虑一下自己示例的变体:
var empties = arr.length - arr.filter(String).length
你所做的就是传递一个本地函数而不是匿名函数,节省了一些宝贵的字节。任何本地构造函数或函数都可以,只要它不返回布尔值。
你需要更具体地说明你认为什么是“最佳方法”。例如,某些方法比其他方法性能更好,某些方法更简洁,某些方法具有更好的兼容性。
你在帖子中提到的解决方案需要浏览器与ECMAScript第5版规范兼容,因此在一些旧版本浏览器(即IE8及以下版本)中无法使用。
“最佳”的全面方法是一个简单的循环。它不像你的方法那样简洁,但毫无疑问它将是最快和最兼容的:
var arr = [1,,2,5,6,,4,5,6,,], count = 0, i = arr.length;
while (i--) {
if (typeof arr[i] === "undefined")
count++;
}
使用循环优化(使用while
和递减速度比for
快)。
另一种方法是对数组进行排序,使得undefined
项都在末尾,并使用循环向后迭代:
var arr = [1,,2,5,6,,4,5,6,,], count = 0;
arr.sort();
while (typeof arr.pop() === "undefined") count++;
alert(count);
这种方法将修改原始数组并删除可能不是您想要的项目。 但是,在非常大的数组上,它可能会更快。
性能测试套件
http://jsperf.com/count-undefined-array-elements
arr.length - arr.filter(Number).length
- vsync