【问题标题】:Manufacturing an array - why is it different? [duplicate]制造阵列 - 为什么不同? [复制]
【发布时间】:2017-03-29 20:30:51
【问题描述】:

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

那么为什么会有差异呢?

【问题讨论】:

  • Object.keys(x) vs Object.keys(y) 绝对是原因。
  • 我从来没有想过要在数组中查找键(鉴于 isArray() 如何返回 true)!

标签: javascript node.js


【解决方案1】:

实际上,两种情况下的结果不应该相同。请参阅此处有关Array 的手册:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

如果传递给 Array 构造函数的唯一参数是整数 在 0 和 232-1(含)之间,这将返回一个新的 JavaScript 数组 其长度属性设置为该数字(注意:这意味着 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]

【讨论】:

  • 所以“空”槽和包含 undefined 的槽有区别吗?我代码中的最后一节表明typeof x[0] == typeof y[0] 为真。那么我怎样才能得到差异呢?
【解决方案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);

【讨论】:

    【解决方案3】:

    使用 Array(4) 创建的 Array 不会被 .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))
    

    【讨论】:

    • 换句话说,这是一模一样的副本?
    • 不是完全相同的副本,但问题的原因是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2018-09-27
    • 2012-12-18
    • 2021-02-18
    • 2014-01-14
    相关资源
    最近更新 更多