成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript-偽數(shù)組

Jackwoo / 3154人閱讀

摘要:什么是偽數(shù)組偽數(shù)組是一個含有屬性的對象例如常見的偽數(shù)組對象偽數(shù)據(jù)如何轉(zhuǎn)成標(biāo)準(zhǔn)數(shù)組使用源碼解析行取數(shù)據(jù)開始值轉(zhuǎn)結(jié)束值直接取的參數(shù)有則使用開始值為負數(shù),重新計算值,從尾部往前推算負數(shù)的絕對值超過長度,開始值賦值為開始值超過長度開始值賦值為結(jié)束值

什么是偽數(shù)組

偽數(shù)組是一個含有l(wèi)ength屬性的json對象

例如:

{
    0: 1,
    1: 2,
    length: 2
}
常見的偽數(shù)組

arguments、NodeList、HTMLCollection、Jquery對象...

偽數(shù)據(jù)如何轉(zhuǎn)成標(biāo)準(zhǔn)數(shù)組

使用Array.slice

function toArray() {
    console.log(arguments instanceof Array) // false
    arguments = Array.prototype.slice.call(arguments)
    console.log(arguments instanceof Array) // true
    return arguments
}
toArray(1,2,3) // [1, 2, 3]
Array.slice源碼解析(587行)
function ArraySlice(start, end) {
    CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice");

    var array = TO_OBJECT(this); 
    var len = TO_LENGTH(array.length); // 取數(shù)據(jù)length
    var start_i = TO_INTEGER(start); // 開始值轉(zhuǎn)Number
    var end_i = len; // 結(jié)束值直接取array的length

    if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); // 參數(shù)有end則使用end

    if (start_i < 0) { // 開始值為負數(shù),重新計算值,從尾部往前推算
        start_i += len;
        if (start_i < 0) start_i = 0; // 負數(shù)的絕對值超過長度,開始值賦值為0
    } else {
        if (start_i > len) start_i = len; // 開始值超過長度, 開始值賦值為len
    }

    if (end_i < 0) { // 結(jié)束值為負數(shù),重新計算值,從尾部往前推算
        end_i += len;
        if (end_i < 0) end_i = 0; // 負數(shù)的絕對值超過長度,結(jié)束值賦值為0
    } else {
        if (end_i > len) end_i = len; // 開始值超過長度, 結(jié)束值賦值為len
    }

    var result = ArraySpeciesCreate(array, MaxSimple(end_i - start_i, 0)); // 創(chuàng)建一個數(shù)組

    if (end_i < start_i) return result; // 結(jié)束值小于開始值,那么直接返回空數(shù)組

    if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { // array是數(shù)組
        %NormalizeElements(array);
        if (IS_ARRAY(result)) %NormalizeElements(result);
        SparseSlice(array, start_i, end_i - start_i, len, result);
    } else { // array不是數(shù)組
        SimpleSlice(array, start_i, end_i - start_i, len, result);
    }

    result.length = end_i - start_i;  // 數(shù)組長度賦值

    return result;
}
/*
* array 具體操作的數(shù)組
* start_i 開始位置
* del_count 需要處理的長度
* len 數(shù)組長度
* deleted_elements 利用淺拷貝,返回結(jié)果,對于slice來說,是選擇的那部分?jǐn)?shù)組,對于splice來說,是刪除的那些數(shù)組
*/
function SparseSlice(array, start_i, del_count, len, deleted_elements) {
    // Move deleted elements to a new array (the return value from splice).
    var indices = %GetArrayKeys(array, start_i + del_count);
    if (IS_NUMBER(indices)) {
        var limit = indices;
        for (var i = start_i; i < limit; ++i) {
            var current = array[i];
            if (!IS_UNDEFINED(current) || i in array) {
                %CreateDataProperty(deleted_elements, i - start_i, current);
            }
        }
    } else {
        var length = indices.length;
        for (var k = 0; k < length; ++k) {
            var key = indices[k];
            if (key >= start_i) {
                var current = array[key];
                if (!IS_UNDEFINED(current) || key in array) {
                    %CreateDataProperty(deleted_elements, key - start_i, current);
                }
            }
        }
    }
}
/*
* array 具體操作的數(shù)組
* start_i 開始位置
* del_count 需要處理的長度
* len 數(shù)組長度
* deleted_elements 利用淺拷貝,返回結(jié)果,對于slice來說,是選擇的那部分?jǐn)?shù)組,對于splice來說,是刪除的那些數(shù)組
*/
function SimpleSlice(array, start_i, del_count, len, deleted_elements) {
    for (var i = 0; i < del_count; i++) {
        var index = start_i + i;
        if (index in array) {
            var current = array[index];
            %CreateDataProperty(deleted_elements, i, current);
        }
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98018.html

相關(guān)文章

  • javascript高級程序設(shè)計》筆記_數(shù)組 稀疏數(shù)組 數(shù)組

    摘要:數(shù)組是數(shù)據(jù)的有序列表,與其他語言不同的是,數(shù)組的每一項可以保存任何類型的數(shù)據(jù)。如下的代碼創(chuàng)建的就是一個密集數(shù)組稀疏數(shù)組與密集數(shù)組相反,并不強制要求數(shù)組元素是緊密相連的,即允許間隙的存在。 數(shù)組是數(shù)據(jù)的有序列表,與其他語言不同的是,ECMAScript 數(shù)組的每一項可以保存任何類型的數(shù)據(jù)。也就是說,可以用數(shù)組的第一個位置來保存字符串,用第二位置來保存數(shù)值,用第三個位置來保存對象, 以此類...

    pepperwang 評論0 收藏0
  • 重論JavaScript數(shù)組的種種

    摘要:偽數(shù)組的偽數(shù)組理解什么是偽數(shù)組定義但是有屬性以下是常見偽數(shù)組對象偽數(shù)組轉(zhuǎn)為真數(shù)組自定義偽數(shù)組類數(shù)組從對象構(gòu)建偽數(shù)組的兩個條件具有具有中任意一個并調(diào)用最終結(jié)果就是生成這個屬性具有名為的方法類數(shù)組當(dāng)作數(shù)組使用的原理相當(dāng)于的鍵名上述也可以用來寫特 偽數(shù)組 javascript的偽數(shù)組理解 什么是偽數(shù)組? 定義:obj instanceof Array === false 但是有l(wèi)ength...

    jay_tian 評論0 收藏0
  • JavaScript-數(shù)組

    摘要:什么是數(shù)組數(shù)組是值的有序集合。這個位置用數(shù)字表示叫索引數(shù)組用字符串表示叫關(guān)聯(lián)數(shù)組。 什么是數(shù)組 數(shù)組是值的有序集合。數(shù)組中的每個值叫一個元素,每個元素在數(shù)組中都有一個唯一的位置。這個位置用數(shù)字表示叫索引數(shù)組;用字符串表示叫關(guān)聯(lián)數(shù)組。數(shù)組的元素可以是不同的類型可以動態(tài)的向數(shù)組差人新元素,或者刪除指定元素 一維數(shù)組 定義數(shù)組 定義數(shù)組的方式有三種 /*數(shù)組字面量方式定義數(shù)組*/ var a...

    XanaHopper 評論0 收藏0
  • ES6 的 for..of 和 Generator,從數(shù)組 jQuery 對象說起

    摘要:引用自可迭代對象和迭代器不以規(guī)矩,不成方圓為了使某個對象成為可迭代對象象,它必須實現(xiàn)方法,也就是說,它得有一個是的屬性。的遍歷,絕對應(yīng)該用。 pseudo 英 [sju:d??] 美 [su:do?]adj.假的,虛偽的n.[口]假冒的人,偽君子 pseudo-array 英 [sju:d???re?] 美 [sju:d???re?][計] 偽數(shù)組 jQuery 對象是偽數(shù)組 兩個...

    Harriet666 評論0 收藏0
  • 數(shù)組(ArrayLike)

    摘要:偽數(shù)組偽數(shù)組的定義和特性偽數(shù)組,又稱類數(shù)組。利用數(shù)組的方法推薦或者使用返回一個新的數(shù)組用或把他的作用環(huán)境指向偽數(shù)組。注意這個返回的數(shù)組中,不會保留索引值以外的其他額外屬性。 偽數(shù)組(ArrayLike) 偽數(shù)組的定義和特性 偽數(shù)組 (ArrayLike) ,又稱類數(shù)組。是一個類似數(shù)組的對象,但是有如下幾個特征。 按索引方式儲存數(shù)據(jù) 0: xxx, 1: xxx, 2: xxx......

    zlyBear 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<