2011-11-30 30 views
2

有一個奇怪的情況,其中JavaScript參數對象嚴重依賴。我有「解決」問題,但想知道如果有人能向我解釋一些,從這個代碼產生的行爲:如何將一個新的參數推送到javascript的參數對象

function whatweget(arg1,arg2,arg3) { 
    while(arguments.length<3) { arguments[arguments.length++] = undefined; } 
    console.log(arguments); 
} 
function argstest() { 
    arguments[arguments.length++] = 3; 
    console.log(arguments); 
} 
whatweget(1,2); 
whatweget(1,2,3); 
whatweget(1,2,3,4); 
argstest(3); 

輸出在Chrome:

[1, 2, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined] 
[1, 2, 3] 
[1, 2, 3, 4] 
[3, 3] 

檢查arguments對象在whatweget console.log顯示它有20個項目,前3個是粗體,而最後17個稍微褪色。在argstest console.log中檢查參數不會顯示這些'ghost'參數。這不是問題,因爲隨後的腳本將被傳遞'參數'並使用正確設置的'length'參數,但想知道是否有人對此行爲有任何洞察?

哦,順便說一句,Firefox 8是完全酷的這種行爲。它按預期完成一切工作,除非它不在監視器檢查器中顯示參數對象,但將鼠標懸停在其上時將顯示爲數組。糟糕的Firefox,糟糕的糟糕的Firefox。

+0

'arguments'對象不是一個數組,即使它的行爲像一個。我想你需要將它轉換爲一個數組,然後再嘗試向它推送另一個元素。 – Teddy

+0

我意識到這一點,這就是爲什麼我設置了參數object = undefined at [i](類似於arguments.i = undefined)而不是參數arguments.push(undefined)。我也通過arguments.length ++手動更新.length參數。增加的信息:調試器只有在通過whatweget循環時纔會傳遞2個參數,如預期的那樣。那麼這些鬼影值從哪裏添加? – clumsyfingers

+0

@Teddy:您可以修改參數對象的屬性以及其長度屬性。你也可以添加新的。 – shredder

回答

1

如果您在開發人員控制檯中進行測試,我認爲這是一個控制檯顯示錯誤。

如果您在參數對象上執行for-in以枚舉其所有屬性,則只會得到您期望的3。

function whatweget(arg1,arg2,arg3) { 
    while(arguments.length<3) { arguments[arguments.length++] = undefined; } 
    for(var n in arguments) console.log(n, arguments[n]); 
} 

0 1 
1 2 
2 undefined 

或者,如果我回到arguments對象和測試使用in特性,它顯示的屬性是不存在的。

function whatweget(arg1,arg2,arg3) { 
    while(arguments.length<3) { arguments[arguments.length++] = undefined; } 
    return arguments; 
} 

var args = whatweget(1,2); 

console.log('2' in args); is true 
console.log('5' in args); is false 
+0

我自己的測試證實你的。似乎如果你正常處理異常參數對象,鬼未定義不存在。看起來是一個Chrome的bug。謝謝你和我一起調查! – clumsyfingers

相關問題