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

创建包含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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,591评论 0 8
  • 数组的扩展--转自:阮一峰《ECMAScript 6 入门》 Array.from( Array.from方法用于...
    呼呼哥阅读 619评论 0 0
  • 1.Array.from Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-lik...
    赵然228阅读 683评论 0 0
  • 我愛吃 但不貪吃 以下都是我喜歡的 養樂多 李子园 板栗 樂事原味罐裝薯片 上好佳漢堡球 荷蘭豆 媽祖妙鴨脖 ...
    林小胆阅读 166评论 1 0
  • 小宝连续几天晚饭后精神,闹腾到夜里两点左右才会沉睡。我已经快坚持不住了。虽说白天她睡了我也可以跟着睡,可事实上...
    海蓝26阅读 404评论 0 0