关于arguments类数组转数组的一些笔记(包含对于call和apply的理解)

本文探讨了ES6箭头函数不支持arguments对象的问题,以及如何利用剩余参数rest转换类数组为真实数组。通过实例展示了Array.prototype的方法如slice、concat等如何应用于arguments。同时,解释了call和apply在借用方法中的作用,帮助读者理解这一常见的JavaScript技巧。
摘要由CSDN通过智能技术生成

arguments是一种类数组的对象,对于ES6的箭头函数不起作用

var fn = (a) => {
    console.log("first:"+a)
}

var test = function (b){
    console.log("second:"+b)
}

fn(1)
test(2)

在这里插入图片描述

在mdn上的建议是对于ES6新特性,使用剩余参数rest而不是arguments

顾名思义,虽然长得像Array但实际上用不了Array相关的方法。

因此可以用以下方法将arguments这个类数组转成数组,大体方法是:
首先将Array.prototype数组通过call或apply绑定this到arguments,再调用某个能返回整个数组的方法

例如,以下方法都可以实现这个效果:

var arrayLike = {0: 'name', 1: 'age', 2: 'sex', length: 3 }

Array.prototype.join.call(arrayLike, '&'); // name&age&sex

Array.prototype.slice.call(arrayLike, 0); // ["name", "age", "sex"] 

Array.prototype.map.call(arrayLike, function(item){
    return item.toUpperCase();
}); // ["NAME", "AGE", "SEX"]

Array.prototype.splice.call(arrayLike, 0); // ["name", "age", "sex"] 

Array.from(arrayLike); // ["name", "age", "sex"] 

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

大体过程讲完了,只能说懂得都懂了,接下来多写点废话,详细剖析下整个过程,将给还不懂的听听。(关于call与apply)

首先明确一点,arguments这是个类数组,也就是说他长得像,但并没有数组的功能,比如这是test函数的arguments,可以看出他原型只有Object而已
arguments类数组长这样捏,可以看出他原型只是Object而已

再随便var个数组,可以看到其原型有Array。

在这里插入图片描述

mdn上对于arguments类数组的描述

mdn上对于arguments类数组的描述

多西哟,想让argmuents使用Array的方法?那就借呗!怎么借呢?答案是使用call和apply这两个方法。
那这两个方法有什么特殊的呢?只用看一个call即可。
以下是其他博客中对于call的模拟实现,原博客地址:https://github.com/mqyqingfeng/Blog/issues/11

var foo = {
    value: 1,
    bar: function() {
        console.log(this.value)
    }
};

foo.bar(); // 1
// 第一步
foo.fn = bar
// 第二步
foo.fn()
// 第三步
delete foo.fn

可以看出,bar在call的时候把自己作为foo中的一个方法,并执行了foo.fn

同理我们可得,

// 第一步
arguments.fn = Array.prototype.slice()
// 第二步
arguments.fn()
// 第三步
delete arguments.fn

Array.prototype.slice把自己作为了arguments中的一个方法,并进行执行位于arguments中的Array.prototype.slice方法
(相当于执行了arguments.Array.prototype.slice())

再根据slice的方法,可以得出关于arguments数组对象的返回。

题外话:这是一种典型的借用其他类方法的解决方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值