资讯专栏INFORMATION COLUMN

Javascript-伪数组

Jackwoo / 3120人阅读

摘要:什么是伪数组伪数组是一个含有属性的对象例如常见的伪数组对象伪数据如何转成标准数组使用源码解析行取数据开始值转结束值直接取的参数有则使用开始值为负数,重新计算值,从尾部往前推算负数的绝对值超过长度,开始值赋值为开始值超过长度开始值赋值为结束值

什么是伪数组

伪数组是一个含有length属性的json对象

例如:

{
    0: 1,
    1: 2,
    length: 2
}
常见的伪数组

arguments、NodeList、HTMLCollection、Jquery对象...

伪数据如何转成标准数组

使用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); // 取数据length
    var start_i = TO_INTEGER(start); // 开始值转Number
    var end_i = len; // 结束值直接取array的length

    if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); // 参数有end则使用end

    if (start_i < 0) { // 开始值为负数,重新计算值,从尾部往前推算
        start_i += len;
        if (start_i < 0) start_i = 0; // 负数的绝对值超过长度,开始值赋值为0
    } else {
        if (start_i > len) start_i = len; // 开始值超过长度, 开始值赋值为len
    }

    if (end_i < 0) { // 结束值为负数,重新计算值,从尾部往前推算
        end_i += len;
        if (end_i < 0) end_i = 0; // 负数的绝对值超过长度,结束值赋值为0
    } else {
        if (end_i > len) end_i = len; // 开始值超过长度, 结束值赋值为len
    }

    var result = ArraySpeciesCreate(array, MaxSimple(end_i - start_i, 0)); // 创建一个数组

    if (end_i < start_i) return result; // 结束值小于开始值,那么直接返回空数组

    if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { // array是数组
        %NormalizeElements(array);
        if (IS_ARRAY(result)) %NormalizeElements(result);
        SparseSlice(array, start_i, end_i - start_i, len, result);
    } else { // array不是数组
        SimpleSlice(array, start_i, end_i - start_i, len, result);
    }

    result.length = end_i - start_i;  // 数组长度赋值

    return result;
}
/*
* array 具体操作的数组
* start_i 开始位置
* del_count 需要处理的长度
* len 数组长度
* deleted_elements 利用浅拷贝,返回结果,对于slice来说,是选择的那部分数组,对于splice来说,是删除的那些数组
*/
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 具体操作的数组
* start_i 开始位置
* del_count 需要处理的长度
* len 数组长度
* deleted_elements 利用浅拷贝,返回结果,对于slice来说,是选择的那部分数组,对于splice来说,是删除的那些数组
*/
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);
        }
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98018.html

相关文章

  • javascript高级程序设计》笔记_数组 稀疏数组 数组

    摘要:数组是数据的有序列表,与其他语言不同的是,数组的每一项可以保存任何类型的数据。如下的代码创建的就是一个密集数组稀疏数组与密集数组相反,并不强制要求数组元素是紧密相连的,即允许间隙的存在。 数组是数据的有序列表,与其他语言不同的是,ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二位置来保存数值,用第三个位置来保存对象, 以此类...

    pepperwang 评论0 收藏0
  • 重论JavaScript数组的种种

    摘要:伪数组的伪数组理解什么是伪数组定义但是有属性以下是常见伪数组对象伪数组转为真数组自定义伪数组类数组从对象构建伪数组的两个条件具有具有中任意一个并调用最终结果就是生成这个属性具有名为的方法类数组当作数组使用的原理相当于的键名上述也可以用来写特 伪数组 javascript的伪数组理解 什么是伪数组? 定义:obj instanceof Array === false 但是有length...

    jay_tian 评论0 收藏0
  • JavaScript-数组

    摘要:什么是数组数组是值的有序集合。这个位置用数字表示叫索引数组用字符串表示叫关联数组。 什么是数组 数组是值的有序集合。数组中的每个值叫一个元素,每个元素在数组中都有一个唯一的位置。这个位置用数字表示叫索引数组;用字符串表示叫关联数组。数组的元素可以是不同的类型可以动态的向数组差人新元素,或者删除指定元素 一维数组 定义数组 定义数组的方式有三种 /*数组字面量方式定义数组*/ var a...

    XanaHopper 评论0 收藏0
  • ES6 的 for..of 和 Generator,从数组 jQuery 对象说起

    摘要:引用自可迭代对象和迭代器不以规矩,不成方圆为了使某个对象成为可迭代对象象,它必须实现方法,也就是说,它得有一个是的属性。的遍历,绝对应该用。 pseudo 英 [sju:dəʊ] 美 [su:doʊ]adj.假的,虚伪的n.[口]假冒的人,伪君子 pseudo-array 英 [sju:dəʊəreɪ] 美 [sju:dəʊəreɪ][计] 伪数组 jQuery 对象是伪数组 两个...

    Harriet666 评论0 收藏0
  • 数组(ArrayLike)

    摘要:伪数组伪数组的定义和特性伪数组,又称类数组。利用数组的方法推荐或者使用返回一个新的数组用或把他的作用环境指向伪数组。注意这个返回的数组中,不会保留索引值以外的其他额外属性。 伪数组(ArrayLike) 伪数组的定义和特性 伪数组 (ArrayLike) ,又称类数组。是一个类似数组的对象,但是有如下几个特征。 按索引方式储存数据 0: xxx, 1: xxx, 2: xxx......

    zlyBear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<