为什么将数组添加到 number return 字符串?

Why does adding an array to number return a string?

var array = [1,2,4];

array+1  //gives '1,2,41'.

谁能解释一下这种行为?

数组转换为字符串 - 然后与也转换为字符串的整数值连接。

当您将 + 符号与已声明的 javascipt 对象 (var array) 一起使用时,即使其中一个元素是数字,它也不会执行 算术运算 加法运算 - 它 将值连接 为两个 字符串

在您的示例中,您的数组 [1,2,4] 被转换为值为 1,2,4 的字符串。所以 1,2,41 连接是 1,2,41

你期待什么? [2,3,5]?

您还没有为数组编写修改器,您向数组(它是一个对象)添加了 1。你为什么期望对象能够加 1?

JS 发现您需要该对象的原语并将该对象列为字符串。现在它知道如何 "add" 2 个字符串(准确地说是它的连接)所以它做到了。

如果您希望整个数组的所有元素都获得 +1。你想要:

for (var i=array .length; i--;) {
    array [i]++;
}

array = array.map(function(e) {return '#' + e});

或者在 ES6 和更高版本的箭头函数中使用 map

array = array.map(i => i + 1);

当运算符的操作数是不同类型时,它们将被转换为通用类型。

数组和数字都可以转成字符串,这叫做强制转换

如果您想将 1 添加到数组中,您可以这样做:

var array = [1,2,4];
array.push(1);

Can anyone explain this behaviour?

此答案试图从规范的角度解释此行为

根据 spec,在 + 的 运行 时间求值期间,两个表达式(左和右)都被转换为其原始值。

  1. Let lprim be ToPrimitive(lval).
  2. Let rprim be ToPrimitive(rval).

toPrimitive 尝试将 hint:number (因为在 算术求值 期间调用)传递给 OrdinaryToPrimitive

  1. If hint is "string", then
    a. Let methodNames be «"toString", "valueOf"».
  2. Else,
    b. Let methodNames be «"valueOf", "toString"». //this gets invoked

由于其中一个值通过上面的 4a)转换为字符串,发生字符串连接

因此

[1,2,4] + 1 => [1,2,4].toString() + "1" => "1,2,4" + "1" => (最后)"1,2,41"