当我这样做时
[ undefined, 'foo' ]
我得到了
const arrayLike = { 1:'foo', 2:'bar', length:3 };
Array.from(arrayLike)
当我这样做时
[ undefined, 'foo', 'bar' ]
我得到了
bar
undefined
?0
?答案 0 :(得分:9)
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
。
无论如何,这不是问题,您仍然可以访问索引1
和2
,它们将返回您希望它们返回的值。
您还可以使用以下命令验证已创建阵列的默认行为:
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))