js类数组

作者: Aniugel | 来源:发表于2019-08-25 13:55 被阅读0次

    定义

    1.具有索引属性(数字)
    2.有length属性
    3.最好加上push属性

    运用

    arguments是常见的类数组
    类数组不具备数组原型的方法,使用其方法会报错

        function test() {
            console.log(Array.isArray(arguments))//false
            arguments.push(5)
            console.log(arguments)//报错 不具备数组的push的方法
        }
        test(1, 2, 3, 4)
    

    可以通过改造让类数组变成真正的数组,并拥有相关的push、slice灯相关方法

    把类数组变成真正的数组,call继承Array中slice方法

    function test() {
            console.log(Array.prototype.slice.call(arguments))
        }
        test(1, 2, 3, 4)
    

    用对象构造一个类数组

        var obj = {
            '0': 1,
            '1': 2,
            '2': 3,
            '3': 4,
            'length': 4,
            'splice': Array.prototype.splice
        }
        console.log(obj)//Object(4) [1, 2, 3, 4, splice: ƒ]
    

    给类数组增加push方法

    // 方法一 推荐使用 将方法直接写在属性上
        var obj = {
            '0': 1,
            '1': 2,
            '2': 3,
            '3': 4,
            'length': 4,
            'push': Array.prototype.push,//增加push方法
            'splice': Array.prototype.splice
        }
        obj.push(5)
        console.log(obj)//Object(4) [1, 2, 3, 4,5, splice: ƒ]
    
        // 方法二 不推荐使用  因为所有的Object中都加了相关的方法
        var obj = {
            '0': 1,
            '1': 2,
            '2': 3,
            '3': 4,
            'length': 4,
        }
        Object.prototype.push = Array.prototype.push
        Object.prototype.splice = Array.prototype.splice
        obj.push(5)
        console.log(obj)
    

    类数组中push方法的实现逻辑

     var obj = {
            '2': 3,
            '3': 4,
            'length': 2,
            'push': Array.prototype.push,//增加push方法
            'splice': Array.prototype.splice
        }
        obj.push(1)
        obj.push(2)
        console.log(obj)//Object(4) [empty × 2, 1, 2, push: ƒ, splice: ƒ]
    
    
        // 实现逻辑 把每次传的参数加在数组末尾 长度加1
        // var arr = [1, 2]
        // Array.prototype.push = function (item) {
        //     this[this.length] = item
        //     this.length++
        // }
    

    拓展:怎么判断一个变量是数组
    1、Array.isArray判断,返回true,说明是数组
    2、instanceof Array判断,返回true。说明是数组
    3、使用Object.prototype.toString.call判断,如果值是[object Array],说明是数组
    4、通过constructor来判断,如果是数组,那么arr.constructor === Array(不准确,因为我们可以指定obj.constructor = Array)

        function fn() {
            console.log(Array.isArray(arguments));   //false; 因为arguments是类数组,但不是数组
            console.log(Array.isArray([1, 2, 3, 4]));   //true
            console.log(arguments instanceof Array); //fasle
            console.log([1, 2, 3, 4] instanceof Array); //true
            console.log(Object.prototype.toString.call(arguments)); //[object Arguments]
            console.log(Object.prototype.toString.call([1, 2, 3, 4])); //[object Array]
            console.log(arguments.constructor === Array); //false
            arguments.constructor = Array;
            console.log(arguments.constructor === Array); //true
            console.log(Array.isArray(arguments));        //false
        }
        fn(1, 2, 3, 4);
    

    相关文章

      网友评论

        本文标题:js类数组

        本文链接:https://www.haomeiwen.com/subject/ypjhectx.html