类数组与数组

文章详细介绍了如何将具有length属性和索引的对象(类数组)转换为真正的数组,包括使用call或apply调用数组方法如slice、splice和concat,以及使用Array.from和展开运算符的方法。同时,解析了call和apply在转换过程中的工作原理,并提供了遍历类数组的示例。
摘要由CSDN通过智能技术生成

目录

类数组特性

应用场景

类数组->数组

1.通过call调用数组的splice方法

2.通过call调用数组的slice方法

3.通过apply调用数组的concat方法

4.Array.from

5.展开运算符

分析call,apply调用数组方式实现数组转换的原理

遍历类数组


类数组特性

  • 具有length属性和若干索引属性的对象
  • 不具有数组常见的方法属性

应用场景

  • arguments:属性是从0递增的数字,具有callee和length属性
  • DOM方法的返回结果     
    • getElementAll  
    • getElementsByTagName/Classname/Name
  • querySelectorAll

类数组->数组

1.通过call调用数组的splice方法

Array.prototype.splice.call(arrayLike,0)

2.通过call调用数组的slice方法

let arrayLike= {0: 'foo', 1: 'bar', 2: 'baz', 3: 'qux', length: 4}
Array.prototype.slice.call(arrayLike,1,3)
// ['bar', 'baz']

3.通过apply调用数组的concat方法

Array.prototype.concat.apply([],arrayLike)

4.Array.from

Array.from(arrayLike)

5.展开运算符

[...arrayLike] 

分析call,apply调用数组方式实现数组转换的原理

这里以 Array.prototype.slice.call(arrayLike,1,3) 为例

1.通过call将this指向Array.prototype变为arrayLike,传入的参数为slice,使arrayLike上也具有了slice方法,等同于

Array.prototype.call(ArrayLike,slice)

2.slice只需要有length属性,不需要一定是Array/String(甚至length属性类型不是number都可,如果不能转化为num,则返回0)

// slice源码
function slice(start, end) 
{ 
  var len = ToUint32(this.length), result = []; 
  for(var i = start; i < end; i++)
  { 
      result.push(this[i]); } return result; 
  }

3.通过slice,返回指定的数组

arrayLike.splice(1,3)

遍历类数组

用以上方法将类数组转化成数组,forEach遍历

Array.prototype.forEach.call(arrayLike,a=>{concole.log(a)})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值