为什么Array.from()返回第一个未定义的元素?

时间:2017-07-11 17:02:10

标签: javascript arrays ecmascript-6

当我这样做时

[ undefined, 'foo' ]

我得到了

const arrayLike = { 1:'foo', 2:'bar', length:3 };
Array.from(arrayLike)

当我这样做时

[ undefined, 'foo', 'bar' ]

我得到了

bar
  • 为什么在设置长度时看不到undefined
  • 为什么只有在我将长度设置为3时才会看到我的元素?
  • 为什么第一个元素显示为0

2 个答案:

答案 0 :(得分:9)

数组在JavaScript

中被Array.from编入索引

所有这些问题都很简单。 0假设您给它的类数组对象是零索引的。如果不是,您将获得一个零索引的数组,其中包含未设置的所有元素,包括undefined设置为const arrayLike = { 1:'foo', 2:'bar', length:2 }; Array.from(arrayLike); 。所以在你的例子中,

const arrayLike = { 0:undefined, 1:'foo', 2:'bar', length:2 };
Array.from(arrayLike);

基本上与

相同
const arrayLike = { 0:'foo', 1:'bar', length:2 };
Array.from(arrayLike);

因为长度小于max元素,所以它基本上停止在那个点迭代,而假长度则用作截断。你想要的可能是什么,

length

或者,如果您从1索引的源获取类似数组,请相应地设置shift以免丢失最后一个元素,然后从结果中删除第一个元素(等效const arrayLike = { 1:'foo', 2:'bar', length:3 }; let arr = Array.from(arrayLike).splice(1); let arr = Array.from(arrayLike); arr.shift(); let [, ...arr] = Array.from(arrayLike); )。

{{1}}

答案 1 :(得分:1)

Array.from(obj)不会返回undefined,它会使用来自给定类似数组的对象obj的属性返回新数组

创建的每个索引位置的默认值在未给定时未定义

您看到的undefined值位于创建的数组的索引0

无论如何,这不是问题,您仍然可以访问索引12,它们将返回您希望它们返回的值。

您还可以使用以下命令验证已创建阵列的默认行为:



console.log(new Array(10))




记录(索引位置0..9)(长度10):

[undefined x 10]

在JavaScript中,您不会看到除0之外的第一个索引的任何数组。独立地如何创建数组。

您正在做的另一种选择是设置原型



const arrayLike = { 1:'foo', 7:'bar' };

//Dynamic set the length
arrayLike.length = Math.max(...Object.keys(arrayLike)) + 1;

//Get built-in features of Array to your arrayLike
Object.setPrototypeOf(arrayLike, Array.prototype);

//Do something
arrayLike.forEach((x, i) => console.log("%i: %s", i, x))