美文网首页JavaScript
[JavaScript] 一行语句初始化数组

[JavaScript] 一行语句初始化数组

作者: 何幻 | 来源:发表于2016-03-07 07:16 被阅读577次

    创建包含n个元素的数组,并初始化为0

    Array.apply(null,Array(n)).map(function(v, i){
        return 0;
    });
    

    原理:
    (1)Array如果只接受一个数字作为参数Array(3),Chrome中结果为[undefined × 3],表示具有3个空位

    (2)利用apply可以传一个数组作为多个参数的办法,Apply.apply(null,Array(3))传递了3个undefined作为参数调用Array(undefined,...,undefined),这样会用这些undefined初始化一个新数组,元素分别为undefined

    (3)最后用map来做数组元素的映射。


    注:
    (1)一个参数Array(3)和两个参数Array(3,1)是不同的,

    Array(3)      // [undefined × 3]
    Array(3,1)    // [3, 1]
    

    (2)数组的空位
    [undefined × 3][undefined,undefined,undefined]是不同的,虽然length都为3

    除了Array(3)之外,[,,,]也是一种创造数组空位的办法,
    由于数组元素的最后一个逗号会省略,所以,

    [,,,]    // [undefined × 3]
    

    空位来说,forEach会跳过它,元素没有索引属性,

    ['a',,'b']           // ["a", undefined × 1, "b"]
    
    ['a',,'b'].length    // 3
    
    ['a',,'b'][1]        // undefined
    
    0 in ['a',,'b']      // true
    1 in ['a',,'b']      // false
    
    ['a',,'b'][2]        // b
    
    ['a',,'b'].forEach(function(v){console.log(v);});    //a b
    

    (3)对空位的处理
    ES5对空位的处理,很不一致,大多数情况下会忽略空位。

    forEachfiltereverysome都会跳过空位。
    map,会跳过空位,但会保留这个值,
    jointoString会将空位视为undefined,而undefinednull会被处理成空字符串。

    ES6则是明确将空位转为undefined
    Array.from方法会将数组的空位,转为undefined,见(4)。
    扩展运算符...也会将空位转为undefined,见(5)。
    copyWithin会连空位一起拷贝。
    fill会将空位视为正常的数组位置。
    for...of循环也会遍历空位。
    entrieskeysvaluesfindfindIndex会将空位处理成undefined

    (4)Array.apply可以用ES6的Array.from代替,

    Array.from(Array(3));    // [undefined, undefined, undefined]
    

    (5)另外一个简单的办法,是使用数组的解构运算符...

    [...Array(3).keys()]    // [0, 1, 2]
    

    其中,.keys()返回一个iterator,而[...iterator]将得到一个新的数组。

    let iter=['a', 'b'].keys();
    iter.next();    //{value:0,done:false}
    iter.next();    //{value:1,done:false}
    iter.next();    //{value:undefined,done:true}
    

    总结:

    Array(3)                       // [undefined × 3]
    
    Array.apply(null, Array(3))    // [undefined, undefined, undefined]
    Array.from(Array(3))           // [undefined, undefined, undefined]
    [...Array(3).keys()]           // [0, 1, 2]
    

    参考

    Array.from
    Array.prototype.keys()
    Spread syntax

    相关文章

      网友评论

        本文标题:[JavaScript] 一行语句初始化数组

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