当我们可以使用类似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))
// it will only return the value from first `0: 1`
let arrayLikeObject = {
length: 5,
0: 1,
1: 2
}
console.log(Array.from(arrayLikeObject))
// other 3 values will be printed as undefined
但是,我不想转换它...
您实际上想创建一个数组,而不是类似数组的对象。必须像您说的那样转换类似数组的对象:
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) // Type error
在以下代码段中,结果将是[undefined]
长度属性设置为 1 但没有0
索引属性:
let arrayLikeObject = {
length: 1,
slice: function () {
return 1
}
}
console.log(Array.from(arrayLikeObject))
但是如果将长度设置为 0,那么结果将是一个空数组[]
,因为我们告诉我们在这个类似数组的对象中没有任何值。