考虑我声明两个这样的变量(在REPL中完成,节点v7.7.2),我希望它是数组:
var x = Array(4)
var y = Array.from({length: 4})
然后以下内容应该完全相同,但它不会:
x.map(Math.random)
[ , , , ]
y.map(Math.random)
[ 0.46597917021676816,
0.3348459056304458,
0.2913995519428412,
0.8683430009997699 ]
在观察中,似乎x和y都是相同的:
> typeof x
'object'
> typeof y
'object'
> Array.isArray(x)
true
> Array.isArray(y)
true
> x.length
4
> y.length
4
> typeof x[0]
'undefined'
> typeof y[0]
'undefined'
为什么差异?
答案 0 :(得分:4)
实际上,两种情况都不应该有相同的结果。请参阅此处有关Array
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
如果传递给Array构造函数的唯一参数是整数 在0到232-1(含)之间,这将返回一个新的JavaScript数组 将其length属性设置为该数字(注意:这意味着一个 arrayLength空槽的数组,而不是实际未定义的槽 值强>)。如果参数是任何其他数字,则为RangeError异常 扔了。
关于Array.from()
方法
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from
检查上面链接的页面上的以下示例:
// Generate a sequence of numbers
// Since the array is initialized with `undefined` on each position,
// the value of `v` below will be `undefined`
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]
答案 1 :(得分:2)
对于前三个输出,Array#map
有效。
不会调用数组中缺少的元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。
Array.from
的ECMA 262标准描述了一个具有新阵列长度的构造(第7点ff)。
var x = Array(4),
y = Array.from({ length: 4 }),
arrayX = x.map(Math.random),
arrayY = y.map(Math.random),
z = Array.from({ length: 4 }, Math.random);
console.log(x);
console.log(y);
console.log(arrayX);
console.log(arrayY);
console.log(z);
答案 2 :(得分:1)
使用Array(4)创建的数组不会使用.map()进行迭代,而Array.from({length:4})将被迭代。可以在JavaScript "new Array(n)" and "Array.prototype.map" weirdness找到更全面的解释,您可以使用..
进行测试x.map((f,i) => console.log(i)) vs. y.map((f,i) => console.log(i))