关于在类数组中使用数组方法

类数组是指具有数字索引下标并且有length属性的对象

{'1': 'a', '2': 'b', length: 3}
复制代码

由于它们并不是真正的数组并不能使用数组的方法;那么有什么方法可以让他们用上方便的数组方法呢?

借助call和apply
(function() {
    Array.prototype.push.call(arguments, 4)
    console.log(arguments)
    // [1,2,3,4]/{ '0': 1, '1': 2, '2': 3, '3': 4 }
})(1,2,3)
复制代码
利用反柯里化优化该方法

我们在函数原型上添加一个方法uncurrying

Function.prototype.uncurrying = function() {
    let self = this;
    // 这里是拿出参数组中的第一个参数赋值给obj,剩下的参数就是arguments
    return function() {
        let obj = Array.prototype.shift.call(arguments)
        return self.apply(obj, arguments)
      }
}
复制代码

使用方法

// 生成一个可以随处使用的push方法
let push = Array.prototype.push.uncurrying()
;(function() {
    push(arguments, 4)
    console.log(arguments)
    // [1,2,3,4]/{ '0': 1, '1': 2, '2': 3, '3': 4 }
})(1,2,3)
复制代码

甚至我们可以直接把类数组不支持的方法直接复制到array对象上。

var arr = ['push', 'shift', 'forEach']
for(let i = 0, fn; fn = arr[i++];) {
    Array[fn] = Array.prototype[fn].uncurrying()
}

var obj = {
    length: 2,
    '0': 1,
    '1': 2
}

Array.push(obj, 3);
console.log(obj) //Object {0: 1, 1: 2, 2: 3, length: 3}
Array.shift(obj) // 1
console.log(obj) //Object {0: 2, 1: 3, length: 2}
Array.forEach(obj, function(i, n){
  console.log(i,n)
})
// 2 0
// 3 1
复制代码

转载于:https://juejin.im/post/5c06202ee51d451dba456a87

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值