相同的问题也在我的脑海中浮现,我们为什么可以使用类似于
arguments
参数的数组:
function arrayLike() {
console.log(typeof arguments)
console.log(arguments)
console.log(Array.from(arguments))
}
arrayLike(1,2,3)
那么,让我们尝试创建自己的类似数组的对象:
let arrayLikeObject = {
0: 1,
1: 2
}
console.log(Array.from(arrayLikeObject))
显然,这里没有定义长度属性,所以我们的arrayLikeObject只会返回一个空数组。现在,让我们试着定义一个长度属性:
let arrayLikeObject = {
length: 2,
0: 1,
1: 2
}
console.log(Array.from(arrayLikeObject))
如果长度设置不同会怎样?
let arrayLikeObject = {
length: 1,
0: 1,
1: 2
}
console.log(Array.from(arrayLikeObject))
let arrayLikeObject = {
length: 5,
0: 1,
1: 2
}
console.log(Array.from(arrayLikeObject))
但是,我不想转换它...
实际上你想创建一个数组,而不是类似数组的对象。类似数组的对象必须像你说的那样被转换:
Array.prototype.slice.call(arrayLikeObject)
// Or,
[].slice.call(arrayLikeObject)
如果你尝试在类似数组的对象上使用数组方法,那么你将会得到类型错误:
let arrayLikeObject = {
length: 5,
0: 1,
1: 2
}
console.log(arrayLikeObject.sort())
因此,要在arrayLikeObject上使用数组方法,我们需要将其转换为数组,就像我们在之前的示例中使用
Array.from
一样。
否则,您只需要创建一个数组:
let arr = [1,2] // I don't mean, you don't know
其他注意事项:
你不能将其用作构造函数:
let arrayLikeObject = {
length: 1,
slice: function () {
return 1
}
}
console.log(new arrayLikeObject)
在下面的代码片段中,由于长度属性被设置为1但没有索引为0的属性,结果将是
[undefined]
:
let arrayLikeObject = {
length: 1,
slice: function () {
return 1
}
}
console.log(Array.from(arrayLikeObject))
但是,如果将长度设置为0,则结果将是一个空数组[]
,因为我们告诉这个类似数组的对象没有任何值。
arguments
是如何工作的。我想知道为什么它们被记录为数组。:-P - gen_Ericarguments
的工作方式。这是各种控制台的工作方式,它们可能彼此不同。也许我有点误解了你上面的句子。 - user1106925