Eng*_*eer 25 javascript arrays undefined
考虑:
var a = Array(3);
var b = [undefined,undefined,undefined];
Run Code Online (Sandbox Code Playgroud)
是什么原因a.map并b.map产生不同的结果?
a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined]
b.map(function(){ return 0; }); //produces -> [0,0,0]
Run Code Online (Sandbox Code Playgroud)
Rob*_*b W 24
数组构造函数创建一个具有给定长度的数组.它并不会创建密钥.Array.prototype.map的回调函数仅对列表中的元素执行.
也就是说,这是与一个键(整数)相关联的所有值0≤ 我 < 长度.
Array(3)没有键,所以.map回调永远不会被触发.[void 0, void 0, void 0] 有三个键,为其执行回调函数.
Array(3).hasOwnProperty(0); // false
[void 0, void 0, void 0].hasOwnProperty(0); // true
Run Code Online (Sandbox Code Playgroud)MDN提到了规范及其填充物.在第47行,if (k in O) {显示回调函数不处理不存在的键.
map 仅迭代现有属性,而不是空索引。
因此,如果您希望它起作用,则必须首先填充数组。
有多种方法可以做到这一点,例如:
.fill(),在ES6中引入
console.log(new Array(3).fill().map(function(){ return 0; }));Run Code Online (Sandbox Code Playgroud)
var arr = [].concat.apply([], new Array(3));
console.log(arr.map(function(){ return 0; }));Run Code Online (Sandbox Code Playgroud)
一个旧的for循环。
var arr = new Array(3);
for(var i=0; i<arr.length; ++i) arr[i] = 1; /* whatever */
console.log(arr.map(function(){ return 0; }));Run Code Online (Sandbox Code Playgroud)
Etcetera。