为什么`arguments`在JS函数中是类似数组的?

时间:2014-11-24 05:39:35

标签: javascript

我不明白为什么arguments在JS函数中是类似数组的?

如何在length中找到arguments属性?

为什么Object.keys(arguments)无法输出length属性?

3 个答案:

答案 0 :(得分:1)

试试看,你就明白了:

$ js 
> !function(){console.log(arguments.length);}(1,2,3)
3

Also:
>!function(){ console.log(Object.keys(arguments).length); }(1,2,3)
3

答案 1 :(得分:0)

JavaScript中的{p> arguments与数组类似,原因如下:例如,在没有类型安全的情况下允许灵活性,并且能够实现“重载” - 不是真正的重载,但是你可以做同样的事情例如,函数用作getter和setter,因为无论如何你都无法在js中重载。

以下面的例子为例:

var theName;

function name() {
    if (arguments.length > 0) {
        theName = arguments[0];
    } else {
        return theName;
    }
};

正如您所看到的,相同的函数可以在您的代码中提供几个不同的函数(当然您希望谨慎使用它) - 但是请参考jQuery中的$(); aka jQuery()函数 - 它有很多不同的东西可以看到更多内容here。互联网主食$.ajax()的相同内容在here上看到更多内容。

如果它不是类似于数组的对象,那么传递的参数多于或少于函数签名所需的参数会产生错误。这并不意味着如果你的函数中缺少一个参数,你就不会抛出错误 - 但它可以让你灵活地拥有可选的参数,或者在同一个函数中传递一个数组或一个字符串来增加或增加目的或代码的结果。 - 它允许许多使JavaScript如此灵活的东西(例如Function.prototype.apply())。

简而言之,它是数组的原因是JavaScript工作方式的基础以及它如此灵活的原因。

此外,argument对象如何工作就像一个数组(因此通过索引访问,即arguments[0])并且它具有length属性。

修改

我看到你也问过为什么Object.keys(arguments)不起作用 - 这是因为arguments是一个特殊的对象,它不起作用,参数对象的length属性与标准数组或JS上的不同宾语。 - 您需要将参数复制到数组中,通过索引访问它,或者使用列出的方法之一here

答案 2 :(得分:0)

  

我不明白为什么参数在JS函数中是类似数组的?

因为规格说明了。 From this spec ref here

  

当控件进入功能代码的执行上下文时,a   创建arguments对象,除非(如10.5中所指定)   标识符参数作为函数中的标识符出现   FormalParameterList或作为标识符出现   函数中包含VariableIclaration或FunctionDeclaration   代码。

您可以通过测试它来检查它是一个对象(像数组一样)而不是实际上是一个数组:

function test(param1, param2) {
    document.getElementById("result").innerText += arguments instanceof Array;
    document.getElementById("result").innerText += arguments instanceof Object;
    document.getElementById("result").innerText += arguments.length;
}

test("str1", "str2");
<p id="result"></p>

  

如何在参数中找到length属性?

使用length中的arguments.length