如何[1,2]和#x2B;JavaScript中的[4,5,6][1]=1,25

如何[1,2]和#x2B;JavaScript中的[4,5,6][1]=1,25,javascript,string,concatenation,concat,Javascript,String,Concatenation,Concat,我从采访中得到这个问题 [1,2] + [4,5,6][1] JavaScript给出答案1,25 这是怎么发生的?请解释清楚。让我们从最后一部分开始,写得更详细些 var arr = [4,5,6]; var value = arr[1]; 与 [4,5,6][1] 由于数组是基于零的,所以给出了5,所以 [1,2] + 5; 第一部分等于 [1,2].toString(), 这将返回字符串“1,2”,因为在这样的表达式中使用数组时,数组会被转换为字符串,因为数组不能添加到数字中

我从采访中得到这个问题

[1,2] + [4,5,6][1]
JavaScript给出答案1,25


这是怎么发生的?请解释清楚。

让我们从最后一部分开始,写得更详细些

var arr   = [4,5,6];
var value = arr[1];

[4,5,6][1]
由于数组是基于零的,所以给出了
5
,所以

[1,2] + 5;
第一部分等于

[1,2].toString(),
这将返回字符串
“1,2”
,因为在这样的表达式中使用数组时,数组会被转换为字符串,因为数组不能添加到数字中,因此

"1,2" + 5
将字符串与数字连在一起就得到了字符串,将这些字符串相加就得到了字符串

"1,25"

它分解如下:

首先是:

[1,2] + [4,5,6][1]
首先,对每一侧进行求值,因为右侧是数组初始值设定项和查找,所以结果是
5

[1,2] + 5
现在开始工作。它不是为数组定义的,它做的第一件事是尝试将其操作数转换为字符串或数字。对于数组,它将是一个字符串,就像从
array#toString
,它将
array#join
,为我们提供:

"1,2" + 5

当使用
+
时,如果任一侧是字符串,则结果是字符串串联。

首先,
[4,5,6][1]
计算为数字
5

然后,将
+
运算符应用于第一个参数,该参数是
数组
而不是
数字
,因此javascript假定您正在进行字符串连接,而不是加法。您的数组
[1,2]
成为一个字符串,即
“1,2”
。您可以通过
[1,2].toString()看到这一点


数字
5
现在被追加到一个字符串中,因此它被转换为一个字符串,并被追加到一起,得到
“1,25”

[1,2]+[4,5,6][1]=[1,2]+5=“1,2”+5=“1,25”这是个非常好的问题。可惜的是,由于该产品的独特性,它不会获得良好的曝光率title@vsync对标题有什么建议吗?@vsync:这些晦涩难懂的强制性问题即使不是几百个,也有几十个。简单的答案总是一样的。。。JS运算符处理所有值。没有意义的值通常被强制为其他值。引用ECMAScript规范是许多人跳过的一个关键步骤。因此,您真正的问题似乎是为什么
[4,5,6][1]
返回
5
。这是因为您正在访问数组的第二个元素。我希望这并不奇怪。因为JS将数组强制为它理解的
+
运算符。我不知道
+
运算符会影响剩下的内容JavaScript通常会尝试将内容转换为它理解的其他内容,主要是字符串,这就是为什么可以执行
“3”+3
并获得
“33”
@vsync:鉴于您使用JavaScript的经验,我很惊讶您(仍然)认为这一切都很疯狂。@vsync:Dynamic typing是JS的一个核心方面,这就是为什么我对您来说这是一个新事物感到惊讶的原因。尽管如此,了解JS,它总能找到让我们惊喜的方法。