JavaScript 类数组对象

作者: tao_tao | 来源:发表于2016-06-21 10:44 被阅读80次

    定义


    JavaScript 类数组对象的定义:

    可以通过索引访问元素,并且拥有 length 属性;

    没有数组的其他方法,例如 pushforEachindexOf 等。

    举例说明

    var foo = {
        0: 'Java',
        1: 'Python',
        2: 'Scala',
        length: 3
    }
    

    转换


    如果类数组对象需要转化为数组,可以用 Array.prototype.slice.call

    var foo = {
        0: 'Java',
        1: 'Python',
        2: 'Scala',
        length: 3
    }
    
    var arr = Array.prototype.slice.call(foo);
    

    其实一开始看到这个表达式感觉比较费解,后来查了一些资料,终于明白了,特别做一些说明:

    第一, foo 本来是没有 slice 方法的, Array.prototype.slice.call(foo) 这个表达式相当于赋予 foo 这个对象 slice 方法。

    第二, Array.prototype.slice.call(foo); 相当于 Array.prototype.slice.call(foo, 0); 是把取一个数组(或者类数组)的子集,并作为一个数组返回。所以当后面的作用对象是一个类数组时,就会把这个类数组对象转换为了一个新的数组。

    所以,上面的一段代码等价于

    var foo = {
        0: 'Java',
        1: 'Python',
        2: 'Scala',
        length: 3
    }
    
    foo.slice = Array.prototype.slice;
    foo.slice();
    

    特性


    类数组只有索引值和长度,没有数组的各种方法,所以如果要类数组调用数组的方法,就需要使用 Array.prototype.method.call 来实现。

    例如,如果遍历一个类数组,可以这样实现:

    Array.prototype.forEach.call(foo, function(item){
        console.log(item);
    });
    

    添加一个元素

    Array.prototype.push.call(foo, 'PHP');
    
    // foo = {0: "Java", 1: "Python", 2: "Scala 111", 3: "PHP", length: 4}
    

    原文:https://blog.taotao.io/javascript-array-like-object/

    相关文章

      网友评论

        本文标题:JavaScript 类数组对象

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