那我用Array(1,2,3)总可以了吧,当然,在这里是可以的。但是有一个悲剧的事实是: Array(2) 并不等于[2],而等于[undefined x 2]。
Array(1,2,3)
Array(2)
[2]
[undefined x 2]
没错,这是一个函数做两件事情。
另外需要注意的是,这里是[undefined x 2],而不是[undefined, undefined]。
[undefined, undefined]
他们有什么区别呢?
undefined x n代表数组的空洞,是无法被 map 遍历的。
undefined x n
中括号和小括号如果是一行开头就加个前置分号
“写 JS 不加分号”只是一个笼统的说法,真正做的时候并不是无脑全不写,要么像 @dd1994 所说的那样牢记简单的规则,要么永远都不要在行首写 ( / [
( / [
比如说你举的例子,我平时是这么写的:
// range 是一个工具函数,很多函数库都有提供,也可以自己实现一个简单的: const range = (amount, start = 0) => [...Array(amount + start).keys()].splice(start) let count = 123 range(10, 1).map(x => x) // [1,2,3,4,5,6,7,8,9,10]
#2 楼 @nightire 没事我已经记住了 Array(size).fill(init).map((e,i)=>e+i)😐
解决方法上面的都已经说了,规则也挺简单。少数时候分号还是必须的。所以这种风格国外叫 semicolon less 而不是 semicolon free。
我觉得 [a, b, c].doSomething 这种行首写中括号的方式在实际编程中是不可避免,相比写大量冗余的分号,偶尔容忍一点奇怪的语法也是可以接受的。
[a, b, c].doSomething
最后,不管用什么风格,加个 ESLint 检查下总没错。最怕的就是“我想打就打不想打就不打反正也不会报错”流……
不写 js 没这个烦恼