当我们可以使用类似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,那么结果将是一个空数组[],因为我们告诉我们在这个类似数组的对象中没有任何值。