2013-02-10 92 views
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])); 

回答

9

因爲你只有通過一個參數—數組。

嘗試alert(foo(1,2,3,4,5));

參數從0 JavaScript的編號,所以當你從1開始你的片,並通過1周的說法,你什麼也得不到。

注意,它會妨礙優化,使arguments對象「泄漏」出來的功能。由於arguments與形式參數之間的混疊,如果對象被髮送到其他地方,優化器不能真正對該函數進行任何靜態分析,因爲它不知道參數變量會發生什麼情況。

+0

它會更好,然後,複製的論點? '函數foo(){ \t變參=參數; \t return Array.prototype.slice.call(args,1); }' – Eric 2016-05-16 17:45:23

+1

關於'arguments'關鍵字的MDN文章描述了您提到的這個優化問題:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments – Eric 2016-05-16 17:50:07

3

由於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); 
10

arguments是陣列狀物體,其中列出了參數和其他一些性質(例如作爲參考arguments.callee中的當前函數)。

在這種情況下,您的arguments物體看起來是這樣的:

arguments { 
    0: [1,2,3,4,5], 
    length: 1, 
    other properties here 
} 

我覺得這個解釋你看到很好的行爲。嘗試刪除函數調用中的數組括號,或使用arguments[0]來訪問該arry。