2011-06-23 30 views
8

如果參數只是一個具有length屬性的對象,那麼爲什麼它看起來與其他非數組對象相比,例如Array.prototype.slice的行爲不同。鑑於「參數」不是一個真正的數組,爲什麼Array.prototype.slice.call(參數)工作,但Array.prototype.slice.call(someobject)不起作用?

例如,以下代碼首先警告「未定義」,然後警告「foo」。爲什麼這些不同?

(function(a){ 
    var myobj = {0 : "foo"}; 
    var myobjarray = Array.prototype.slice.call(myobj); 
    var argumentsarray = Array.prototype.slice.call(arguments); 
    alert(myobjarray.shift()); 
    alert(argumentsarray.shift()); 
})("foo"); 

回答

8

它適用於如果您的對象有length屬性。

var myobj = { 0: "foo", 1: "bar", length: 2 }; 
var myobjarray = [].slice.call(myobj); 
alert(myobjarray.shift()); 

大多數數組方法依賴於length屬性。如果您嘗試對未公開預期接口的對象執行Array方法,則會得到意外的結果。

相關問題