关于javascript:ArrayLike-Objects-详解

5次阅读

共计 1129 个字符,预计需要花费 3 分钟才能阅读完成。

什么是 Array-Like Objects

顾名思义,就是 类数组的对象。类数组对象具备数组的属性 length,然而没有 数组 的一些办法, 比方 push。如下

const arrayLike = {
  0: "1",
  1: "2",
  length: 2
}

比方 arguments 就是一个 Array-Like Objects。

function sum() {console.log(arguments)
}

sum(1, 2, 3)


看起来是一个数组,但咱们能够看见下面截图中的 arguments 的隐式原型 arguments._ _proto__ 中的对象和数组的确不一样的。
咱们来看看一个失常的数组的隐式原型是啥样的。

截图只展现了一部分,然而咱们能够看见有显著的不同,所以说 arguments 是一个 类数组对象 Array-Like Objects。
此时咱们对 arguments 这个类数组对象进行 push 等数组的操作是会报错的。

那么咱们怎么将 array-like 转换成 array 呢?

Array-Like 转 Array

办法一:遍历迭代

因为 Array-Like Objects 是有长度的,所以咱们能够对其进行遍历,将其每一个元素塞进新的数组

function sum() {let arr = []
  for(let i = 0; i < arguments.length; i++) {arr.push(arguments[i])
  }
  arguments = arr
  arguments.push(4) // 此时的 argument 曾经是数组了,能够进行数组的 push 操作
  console.log(arguments) // [1, 2, 3, 4]
} 
sum(1, 2, 3)

办法二:应用 Array.prototype.slice.call()

function sum() {arguments = Array.prototype.slice.call(arguments);
  //  arguments = [].slice.call(arguments);
  arguments.push(4) // 此时的 argument 曾经是数组了,能够进行数组的 push 操作
  console.log(arguments) // [1, 2, 3, 4]
} 
sum(1, 2, 3)

同理,应用 Array.prototype.slice.apply()、Array.prototype.slice.bind() 也是一样的。

办法三:Array.from()

function sum() {arguments = Array.from(arguments);
  arguments.push(4); // 此时的 argument 曾经是数组了,能够进行数组的 push 操作
  console.log(arguments); // [1, 2, 3, 4]
} 

sum(1, 2, 3)
正文完
 0