美文网首页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] 一行语句初始化数组

    创建包含n个元素的数组,并初始化为0, 原理:(1)Array如果只接受一个数字作为参数Array(3),Chro...

  • JavaScript学习笔记

    ### JavaScript学习笔记 ##### JavaScript`语句` - 分号可在一行写多个语句; - ...

  • 数组

    创建和初始化数组 JavaScript 声明, 创建和初始化数组, 如下: 使用 new 关键字,声明并初始化一个...

  • JavaScript 基本语法

    JavaScript 的基本语法 语句 JavaScript 程序的执行单位为行(line),也就是一行一行地执行...

  • JavaScript基础语法

    JavaScript基础语法 语句和注释 ​ JavaScript程序的执行单位为行(line),也就是一行一行地...

  • javascript 语言核心-可选的分号

    javascript也是使用;将语句分割开,有几种情况可以将;省略。 1.如果javascript语句独占一行2....

  • JavaScript基本语法(一)

    一、语句 JavaScript语言的执行单位为line,也就是一行一行的执行。一般情况下,每一行为一个语句。 语句...

  • javascript碎片知识002

    javascript 中的数组 数组的初始化 数组的使用 数组的属性 数组的方法 push 方法:能把元素添加到数...

  • 数组

    创建于初始化数组 用JavaScript声明、创建和初始化数组 new创建数组并不是最好的方式,在实际中只需要用中...

  • 基本语法

    语句 JavaScript 程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。...

网友评论

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

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