什么是偽數組
能通過Array.prototype.slice轉換為真正的數組的帶有length屬性的對象。
這種對象有很多,比較特別的是arguments對象,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組。
我們可以通過Array.prototype.slice.call(fakeArray)將偽數組轉變為真正的Array對象。
在 JavaScript 中, 函數中的隱藏變量 arguments 和用 getElementsByTagName 獲得的元素集合(NodeList)都不是真正的數組,不能使用 push 等方法,在有這種需要的時候只能先轉換為真正的數組。
對於 arguments,可以使用 Array.prototype.slice.call(arguments); 來達到轉換的目的,但對於 NodeList 則不行了,其在 IE8 及以下將會報錯,只能說其 JS 引擎有所限制。
因此,如果需要把 NodeList 轉換為真正的數組,則需要做下兼容處理。
function realArray(c) {
try {
return Array.prototype.slice.call(c);
} catch (e) {
var ret = [], i = 0, len = c.length;
for (; i < len; i++) {
ret[i] = (c[i]);
}
return ret;
}
}
偽數組可以轉換為真正數組條件
1.偽數組的鍵值需要為數字,否則轉換后數組均無初始值
2.有length屬性
如:
var fakeArray01 = {a:'a',b:'b',length:2};//沒有length下標對應的值
var arr01 = Array.prototype.slice.call(fakeArray01);
alert(arr01[0]);//undefined
var fakeArray02 = {0:'a',1:'b',length:'num'};//length不是數值
var arr02 = Array.prototype.slice.call(fakeArray02);
alert(arr02[1]);//undefined
fakeArray01和fakeArray02被轉換成了真正的數組,但是數組中的值都為undefined
鏈接:http://www.open-open.com/code/view/1420818668328
http://www.cnblogs.com/aaronjs/archive/2011/09/05/2167541.html
