译者:
明明如月
审校:
蓝色漂流瓶
今天介绍一个很有意思的点。可能大家平时没有注意。
主要涉及 逗号操作符和concat函数
(谢绝喷子,在这里讲这个并不是因为我们应该多研究这种偏的内容,而是有意思介绍一下。)
想获得下面的结果你需要怎样做?为啥酱紫做也能行呢?
> [].concat[1,2,3]
[ 1, 2, 3 ]
谜底在后面揭晓:
这个表达式非常像:
[].concat([1,2,3])
但实际上他们的含义完全不同:
1 首先
[].concat
的结果是通过计算得来的. 结果是存储在Array.prototype.concat
.的方法。2 然后方括号操作符的操作数进行包裹。它包含了三个数中间的逗号操作符(在此处逗号相当于
+
)。如下:
> 1,2,3
3
3 最后通过
[].concat
返回的'3'
被存储起来。
一般说来开始的那个操作将产生undefined
:
> [].concat[1,2,3]
undefined
然而如果你按照下面这样写,你就可以得到开始时给出的结果:
> Array.prototype.concat[3] = [1,2,3];
> [].concat[1,2,3]
[ 1, 2, 3 ]
【译者注释】
这里其实就是 将数组原型的concat[3] 赋值为数组[1,2,3]
然后 下一行:[].concat[1,2,3]
相当于:[].concat[3]
也就是:Array.prototype.concat[3]
所以打印出 [1,2,3]就非常好理解了
运行结果:
【译者拓展】
对号操作符:表达式1,表达式2,表达式3,..,表达式n
逗号操作符,执行所有操作,但是返回最后侧那个表达式的值。
也就是说 表达式1,到表达式n都会被依次执行,但是返回的是 最后一个表达式n的值。
如:
> var x = 0;
> var y = (x++, 10);
> x
1
> y
10
可以参考:http://speakingjs.com/es5/ch09.html#comma_operator
本文英文源:http://www.2ality.com/2016/11/concat-array-literal.html