5

我正在尝试在 javascript 中声明和初始化一个带有 0 的数组。我创建了一个数组并像这样设置长度。

var previousRow = [];
previousRow.length = 5;

然后,我这样做了。

console.log(previousRow);
previousRow = previousRow.map(Number.prototype.valueOf, 0);
console.log(previousRow);

我得到了,

[ , , , ,  ]
[ , , , ,  ]

但是,当我这样做时

console.log(previousRow);
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0);
console.log(previousRow);

我得到了我所期望的

[ , , , ,  ]
[ 0, 0, 0, 0, 0 ]

为什么第一个代码不起作用?

4

1 回答 1

14

阅读 MDN 文档以获取map. 它明确指出:

callback仅对具有赋值的数组索引调用;对于已被删除或从未被赋值的索引,它不会被调用。

previousRow数组是一个空数组length 5。然而,这些元素从未被赋值:

var previousRow = [];
previousRow.length = 5;

由于 的元素previousRow从未被赋值,它们将永远不会被map. 因此映射Number.prototype.valueOfpreviousRow产生一个包含 5 个元素的空数组:

console.log(previousRow);
previousRow = previousRow.map(Number.prototype.valueOf, 0);
console.log(previousRow);

但是,当您apply previousRow使用Array构造函数时,构造函数会创建一个新数组并将 的值分配给previousRow新数组。

previousRow的元素是否被赋值无关紧要。当 JavaScript 找不到它提供的值时undefined

因此,净效果是新数组有 5 个元素,所有这些元素都由构造函数显式分配。 因此,您可以使用来处理整个数组:undefinedArraymap

console.log(previousRow);
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0);
console.log(previousRow);

您应该阅读以下答案以获得更深入的解释:https ://stackoverflow.com/a/18949651/783743

于 2013-09-28T08:35:05.413 回答