制造阵列 - 为什么它不同?

时间:2017-03-29 20:30:51

标签: javascript node.js

考虑我声明两个这样的变量(在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'

为什么差异?

3 个答案:

答案 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))