为什么map不适用于js中的新数组

时间:2015-05-08 08:18:41

标签: javascript arrays

为什么下面的代码会返回一个未定义值的数组,而我看不到任何日志?

var arr = new Array(10);
arr = arr.map(function () {
    console.log('kapa');
    return 1;
});
console.log(arr);

3 个答案:

答案 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()的回调。