为什么下面的代码会返回一个未定义值的数组,而我看不到任何日志?
var arr = new Array(10);
arr = arr.map(function () {
console.log('kapa');
return 1;
});
console.log(arr);
答案 0 :(得分:3)
您可以使用Array.apply
Array.apply(null, {length: 10}).map(function(){return 1})
答案 1 :(得分:0)
map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。
如果您调用new Array [10]
,则没有元素您必须执行类似
的操作var temp = [];
for(var i=0;i<10;i++){
temp[i]=i;
}
或者在你的情况下
var temp = new Array();
for(var i=0;i<10;i++){
temp.push(i);
}
答案 2 :(得分:0)
ECMAScript规范和稍微更易读的.map()
MDN描述都非常清楚地说明了这一点。不会为数组的空值调用.map()
回调(例如,undefined
的值)。
来自.map()
的MDN说明:
map为一个元素中的每个元素调用一次提供的回调函数 数组,按顺序,并从结果中构造一个新数组。打回来 仅对已分配值的数组的索引调用; 对于未定义的索引,具有的索引,不会调用它 已删除或从未分配过值。
因此,由于var arr = new Array(10);
创建了一个包含十个空插槽的数组,因此.map()
将调用其回调的数组中没有值。
如果您实际将值放在初始数组中,那么您将看到所需的结果:
var arr = [0,1,2,3,4,5,6,7,8,9];
arr = arr.map(function() {
return 1;
});
console.log(arr); // [1,1,1,1,1,1,1,1,1,1]
工作演示:http://jsfiddle.net/jfriend00/9c0hmL2j/
有关.map()
的更多文档,您可以看到ECMAScript specification for Array.prototype.map
。规范该部分中的步骤8b和8c描述了如果给定的数组属性没有值,将不会调用.map()
的回调。