我最近在SO上发现了以下代码片段,以帮助快速填充具有默认值的数组:
Array.apply(null, new Array(3)).map(function() {return 0;});
Run Code Online (Sandbox Code Playgroud)
鉴于Array构造函数和apply方法的行为,上面的代码片段也可以这样重写:
Array.apply(null, [undefined, undefined, undefined]).map(function() {return 0;});
Run Code Online (Sandbox Code Playgroud)
在处理您希望使用默认值填充的稀疏数组时,此技术也很有用:
var sparseArr = [3,,,4,1,,],
denseArr = Array.apply(null, sparseArr).map(function(e) {
return e === undefined ? 0 : e;
});
// denseArr = [3,0,0,4,1,0]
Run Code Online (Sandbox Code Playgroud)
然而,其中出现了两个奇怪之处:
sparseArr未定义最后一个术语,则不映射该术语denseArrsparseArr仅包含单个术语(例如sparseArr = [1])或单个术语后跟单个尾随未定义术语(例如sparseArr = [1,]),则得到的denseArr等于[undefined x 1]谁能解释这种行为?
究竟有什么区别:
Array(3)
// and
Array.apply(null, Array(3) )
Run Code Online (Sandbox Code Playgroud)
第一个返回,[undefined x 3]而第二个返回[undefined, undefined, undefined].第二种是通过环连接Array.prototype.functions,如.map,但第一不是.为什么?