我是靠谱客的博主 舒服铃铛,最近开发中收集的这篇文章主要介绍对JavaScript内置对象arguments的一些见解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

深入理解JavaScript内置对象arguments

这两天有伙伴问到我关于arguments的问题,使我产生了一种arguments对象容易被学习者忽略的想法,想分享一下自己对于JavaScript内置对象arguments的一些见解

(阅读提醒:本文适合对JavaScript中arguments对象 || es6 rest参数了解不多的小伙伴)。

说明:

    与很多语言不同,JavaScript函数可以使用任意数量的参数,调用时传递任意数量的参数。arguments是一个对应于传递给函数的参数的类数组对象,是所有非箭头函数(es6的一种函数)中都可用的局部变量,我们可以使用arguments在函数中引用函数的参数。

arguments是什么类型?

我们先写个方法验证一下:

    function test() {
      console.log(arguments)
    }
    test(1, 2, 3)

运行结果:

看起来arguments对象有点像Array类型,其实不是的,因为它除了length属性和索引元素之外没有任何Array属性,比如Array类型应该有的pop()、push()等它都没有。所以arguments对象不是一个Array,只是类似于Array。

arguments转成数组形式:

代码比较少,直接在控制台输入然后回车即可:

    function test() {
      var args = Array.prototype.slice.call(arguments)
      console.log(Object.prototype.toString.call(args))
    }
    test(1, 2, 3)

结果:

可见arguments被转成了数组类型,此时数组的方法已经可对args使用,在此就不测试了。

注:代码中使用的判断类型的代码是本人目前知道的最准确的方法,可以用于判断引用数据类型的。

arguments对象的callee属性:

说明:它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内。

例子(返回数组各项阶乘后的数组):

    function factorial (n) {
      return !(n > 1) ? 1 : factorial(n - 1) * n;
    }

    [1,2,3,4,5].map(factorial);

代码会返回[1, 2, 6, 24, 120]

但是假设map中的函数为匿名函数,我们应该怎么写?也就是三目运算符后的factorial()函数应该写什么才能调用函数自身?这时候就要用到arguments.callee属性。

    [1,2,3,4,5].map(function (n) {
      return !(n > 1) ? 1 : arguments.callee(n - 1) * n;
    });
运行结果一样。

使用rest参数(es6)

说明:es6中引入了rest参数,它表示一个未知数量的参数作为函数中的一个数组,不仅将额外的参数表示为数组,还解决了arguments对象的许多问题。

测试:

    function test(...rest) {
      console.log(rest)
    }
    test(1, 2, 3)

结果:

可见传入的参数变成了数组类型,此时数组的方法可以对rest使用,比如pop()、push()、split()等等。

怎么判断是数组类型的呢?

打印出的rest中有个__proto__属性,这个属性中包含很多数组方法,也就是指向了Array.prototype所指向的对象,prototype相关知识具体可以参考本人其他关于prototype的文章。

或者还是使用console.log(Object.prototype.toString.call(rest)),前边这串代码没写错的话输出的会是[Object Array]

将多余的参数转为数组类型:
    function test(num1, num2, ...rest) {
      console.log(num1)
      console.log(num2)
      console.log(rest)
    }
    test(1, 2, 3, 4)

运行结果:

注:...rest必须写在参数的最后边,否则会报错,想知道报什么错的话建议自己试试,实践是检验真理的唯一标准...

完结~~期待下次分享~~

最后

以上就是舒服铃铛为你收集整理的对JavaScript内置对象arguments的一些见解的全部内容,希望文章能够帮你解决对JavaScript内置对象arguments的一些见解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部