JS-數組與偽數組


數組與偽數組

把符合以下條件的對象稱為偽數組:

  • 具有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"));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM