數組與偽數組
把符合以下條件的對象稱為偽數組:
- 具有length屬性
- 按索引方式存儲數據
- 不具有數組的push,pop等方法
偽數組(類數組):無法直接調用數組方法或期望length屬性有什么特殊的行為,不具有數組的push,pop等方法,但仍可以用數組遍歷方法來遍歷它們。典型的是函數的argument
參數,還有像調用document.getElementsByTagName
, document.childNodes
之類的,它們返回的NodeList
對象都屬於偽數組。
可以使用以下方法將偽數組轉化為真正的Array對象。
Array.prototype.slice
function makeArray (c) {
try{
return Array.prototype.slice.call(c);
}catch(e){
var ret = [],i, len = c.length;
for(i = 0; i < len; i++) {
ret[i] = (c[i]);
}
return ret;
}
}
ES6中數組的新方法 Array.from()
function test(){
var arg = Array.from(arguments);
arg.push(5);
console.log(arg);
}
test(1,2,3,4); //1,2,3,4,5
ES6展開操作符
es6中,展開操作符對於實現了 Iterator 接口的對象轉為真正的數組
任何 Iterator 接口的對象,都可以用擴展運算符轉為真正的數組。
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
上面代碼中,querySelectorAll方法返回的是一個nodeList對象。它不是數組,而是一個類似數組的對象。這時,擴展運算符可以將其轉為真正的數組,原因就在於NodeList對象實現了 Iterator 。
對於那些沒有部署 Iterator 接口的類似數組的對象,擴展運算符就無法將其轉為真正的數組。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// TypeError: Cannot spread non-iterable object.
let arr = [...arrayLike];
上面代碼中,arrayLike是一個類似數組的對象,但是沒有部署 Iterator
接口,擴展運算符就會報錯。這時,可以改為使用Array.from
方法將arrayLike
轉為真正的數組。
concat+apply
let nodeList = document.querySelectorAll('div');
let nodeArray = Array.prototype.concat.apply([], nodeList); // apply會將nodeList展開
jquery中的,jQuery.toArray()
方法
alert($('li').toArray());
jquery
中,jQuery.makeArray(obj)
將類數組對象轉換為數組對象。
類數組對象有 length 屬性,其成員索引為 0 至 length - 1。實際中此函數在 jQuery 中將自動使用而無需特意轉換。
var arr = jQuery.makeArray(document.getElementsByTagName("div"));