2016-04-18 58 views
1

的內部工作正如我們所知,我們在像將函數參數轉換爲Array的場景中使用Array.prototype.slice.call()。現在,如果我試圖做一些其他的對象,其中包含鍵值以數字方式迭代,以及非數字鍵值,它省略它(非數字)。以下是代碼。Array.prototype.slice.call()

var myobject ={ // array-like collection 
length: 4, 
'0': 'zero', 
'1': 'one', 
'2': 'two', 
'3': 'three' 
} 

var myarray = Array.prototype.slice.call(myobject) // returns myobject as a true array: ["zero", "one", "two", "three"] 

相同的流程,如果即時通訊只使用一個對象只有鍵值如0,1,2,3 ...空數組返回。以下是代碼。

var myobject2 ={ // array-like collection 

'1': 'one', 
'2': 'two', 
'3': 'three' 
} 

var myarray2 = Array.prototype.slice.call(myobject2) //returns empty array 

可有人請解釋爲什麼會這樣????它只看數字鍵,創建空數組並將其轉換爲數字索引嗎?

回答

3

Array.prototype.slice.call()需要一個.length屬性,然後相應的從零開始的數字屬性數(儘管所有屬性名實際上都是字符串,因此它是字符串等效的數字)。如果它沒有找到那些在場的人,它不會正確地執行.slice()

如果源不是實際的數組,那麼它基本上只是進入從0.length - 1的循環,在對象上查找匹配的屬性名稱並將其找到的任何值與該屬性名稱進行復制。屬性名稱必須完全匹配數字的字符串。

任何缺少的數字屬性都會簡單地複製爲undefined,因爲這就是它們的值。

+0

提供的長度屬性與非數字鍵將被推送爲未定義。我對麼? – Vino

+0

@Vino - 任何缺少的數字屬性將被複製爲「undefined」,因爲這就是它們的值。 – jfriend00

+0

有用的快速信息。謝謝! – Vino

相關問題