• arguments的介绍(一)


    arguments 是一个类数组对象。代表传给一个function的参数列表。

    1.1 arguments length

    arguments 是个类数组对象,其包含一个 length 属性,可以用 arguments.length 来获得传入函数的参数个数。

     

    function func() {
        console.log("The number of parameters is " + arguments.length);
    }
    
    func();
    func(1, 2);
    func(1, 2, 3);

    执行结果如下:

    The number of parameters is 0
    The number of parameters is 2
    The number of parameters is 3

    1.2 arguments 转数组

    通常使用下面的方法来将 arguments 转换成数组:

    Array.prototype.slice.call(arguments);
    [].slice.call(arguments);

    1.3 leaking arguments

    另外,有一个需要注意的地方就是,不能将函数的 arguments 泄露或者传递出去。什么意思呢?看下面的几个泄露 arguments 的例子:

    // Leaking arguments example1:
    function getArgs() {
        return arguments;
    }
    
    // Leaking arguments example2:
    function getArgs() {
        const args = [].slice.call(arguments);
        return args;
    }
    
    // Leaking arguments example3:
    function getArgs() {
        const args = arguments;
        return function() {
            return args;
        };
    }

    上面的做法就直接将函数的 arguments 对象泄露出去了,最终的结果就是 V8 引擎将会跳过优化,导致相当大的性能损失。

    可以这样做:

    function getArgs3 () {
        const args = new Array(arguments.length)
        for (let i = 0; i < args.length; i++) {
        args[i] = arguments[i]
        }
        return args;
    }

    1.4 修改arguments的值

       // 修改arguments的值
        function foo(a) {
            "use strict";
            console.log(a, arguments[0]); // 1  1
            a = 10;
            console.log(a, arguments[0]); // 10 1
            arguments[0] = 20;
            console.log(a, arguments[0]); // 10 20
        }
        foo(1);
        function bar(a) {
           console.log('-----非严格模式下的值变化------')
            console.log(a, arguments[0]); // 1 1
            a = 10;
            console.log(a, arguments[0]); // 10 10
            arguments[0] = 20;
            console.log(a, arguments[0]); // 20 20
        }
        bar(1);

    从上面的两个例子中可以看出,在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。

  • 相关阅读:
    STL"源码"剖析
    Excel如何进行SVN
    BootstrapTable+KnockoutJS
    WebApi 集成 Swagger
    Java Core和HeapDump
    深入分析 Java 中的中文编码问题(1)
    Java编码浅析(注意区分三个概念)(转)
    理解并解决GBK转UTF-8奇数中文乱码(转)
    Java实现敏感词过滤(转)
    Android MediaPlayer状态机
  • 原文地址:https://www.cnblogs.com/xuzhudong/p/10254797.html
Copyright © 2020-2023  润新知