JavaScript中如何[1,2] + [4,5,6] [1] = 1,25

Kar*_*Sho 14 javascript string concat concatenation

我从面试中得到了这个问题,

[1,2] + [4,5,6][1]
Run Code Online (Sandbox Code Playgroud)

JavaScript给出答案1,25.

怎么回事?请清楚解释一下.

ade*_*neo 15

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

var arr   = [4,5,6];
var value = arr[1];
Run Code Online (Sandbox Code Playgroud)

是相同的

[4,5,6][1]
Run Code Online (Sandbox Code Playgroud)

并且由于数组是基于零的5,所以我们确实有

[1,2] + 5;
Run Code Online (Sandbox Code Playgroud)

第一部分等于

[1,2].toString(),
Run Code Online (Sandbox Code Playgroud)

并且返回字符串,"1,2"因为当尝试在类似的表达式中使用它时,数组被转换为字符串,因为数组不能添加到数字,然后我们有

"1,2" + 5
Run Code Online (Sandbox Code Playgroud)

用数字连接字符串会产生字符串,并将字符串添加到一起

"1,25"
Run Code Online (Sandbox Code Playgroud)

  • @vsync:鉴于您使用JavaScript的经验,我很惊讶您(仍然)认为这些都是疯狂的. (6认同)
  • 因为JS将数组强制转换为理解`+`运算符的东西. (3认同)
  • @vsync:动态类型是JS的核心方面之一 - 这就是为什么我很惊讶这对你来说是个新手.不过,知道JS,它总是会找到让我们感到惊讶的方法. (3认同)

T.J*_*der 7

它像这样崩溃:

从...开始:

[1,2] + [4,5,6][1]
Run Code Online (Sandbox Code Playgroud)

首先,评估每一方,并且由于右侧是数组初始化器和查找,因此它出现5:

[1,2] + 5
Run Code Online (Sandbox Code Playgroud)

现在+运营商开始工作.它没有为数组定义,它首先要做的是尝试将其操作数转换为字符串或数字.在数组的情况下,它将是一个字符串,就像来自Array#toString,它确实Array#join给了我们:

"1,2" + 5
Run Code Online (Sandbox Code Playgroud)

当您使用+任何一方是字符串时,结果是字符串连接.