2014-11-24 68 views
0

我不明白爲什麼arguments是一個類似於JS的數組函數?如何找到length物業arguments爲什麼`arguments`在JS函數中是一個數組?

爲什麼Object.keys(arguments)無法輸出length屬性?

+1

arguments.length獲取參數的數量..! – 2014-11-24 05:41:35

+0

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments – 2014-11-24 05:44:01

回答

0

arguments是類似數組在JavaScript中的幾個原因,如允許不類型安全,你可以有靈活性,並能夠使「過載」 - 不是真正的重載,但是你可以讓相同的函數作爲一個getter和setter,例如,因爲無論如何你都不能在js中有一個超載。

舉個例子如下:

var theName; 

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

,你可以看到,同樣的功能就可以在你的代碼服務於幾個不同的功能(當然要謹慎地使用這一點 - 而是採取例如$();又名jQuery()功能jQuery的 - 它確實相當多的不同的東西看多它here在互聯網主食$.ajax()同樣的事情看得更上here

,如果它不是一個類似數組的對象,你會得到。來自p的錯誤分析比函數簽名所需的參數更多或更少的參數。這並不意味着如果函數中缺少參數,則不會拋出錯誤 - 但它使您可以靈活地使用可選參數,或者在同一函數中傳遞數組或字符串以添加或增加目的,或者代碼的結果。 - 它允許使JavaScript如此靈活的許多事情(例如Function.prototype.apply())。

簡而言之,它是數組的原因對JavaScript的工作方式以及它爲什麼如此靈活的基本原則。

此外,argument對象如何工作就像一個數組(如此按索引訪問,即arguments[0]),它具有length屬性。

編輯

我看見你還問爲什麼Object.keys(參數)不起作用 - 這是因爲參數是一種特殊的對象,它不是這樣的長度屬性是基於不同參數對象而不是標準數組或JS對象。 - 您需要將參數複製到數組中,通過索引訪問它,或者使用列出的方法之一here

1

試試看,你會得到它:

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

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

我不明白爲什麼參數是一個數組在JS函數?

因爲規格說明如此。 From this spec ref here

當控制進入用於功能代碼的執行上下文,一個 參數對象除非創建(如在10指定。5) 標識符參數作爲函數的 FormalParameterList中的標識符出現,或作爲 函數中包含的變量聲明或函數聲明的標識符出現。

您可以檢查,這是一個對象(陣列等),而不是實際的陣列通過測試出來是這樣的:

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如在arguments.length中那樣。

相關問題