我的理解是,我可以打電話給Array.prototype.slice.call(arguments, 1)
返回數組的尾部。的Javascript「參數」關鍵字
爲什麼不這段代碼返回[2,3,4,5]
?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
我的理解是,我可以打電話給Array.prototype.slice.call(arguments, 1)
返回數組的尾部。的Javascript「參數」關鍵字
爲什麼不這段代碼返回[2,3,4,5]
?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
因爲你只有通過一個參數—數組。
嘗試alert(foo(1,2,3,4,5));
參數從0 JavaScript的編號,所以當你從1開始你的片,並通過1周的說法,你什麼也得不到。
注意,它會妨礙優化,使arguments
對象「泄漏」出來的功能。由於arguments
與形式參數之間的混疊,如果對象被髮送到其他地方,優化器不能真正對該函數進行任何靜態分析,因爲它不知道參數變量會發生什麼情況。
由於arguments
是{0: [1,2,3,4,5], length: 1}
,這與一個元素的數組狀物體。具有一個元素的數組的尾部是空數組。
要麼改變函數的定義:
function foo(arr) {
return Array.prototype.slice.call(arr,1);
}
或調用該函數:
foo(1,2,3,4,5);
arguments
是陣列狀物體,其中列出了參數和其他一些性質(例如作爲參考arguments.callee
中的當前函數)。
在這種情況下,您的arguments
物體看起來是這樣的:
arguments {
0: [1,2,3,4,5],
length: 1,
other properties here
}
我覺得這個解釋你看到很好的行爲。嘗試刪除函數調用中的數組括號,或使用arguments[0]
來訪問該arry。
它會更好,然後,複製的論點? '函數foo(){ \t變參=參數; \t return Array.prototype.slice.call(args,1); }' – Eric 2016-05-16 17:45:23
關於'arguments'關鍵字的MDN文章描述了您提到的這個優化問題:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments – Eric 2016-05-16 17:50:07