为什么在数字中添加数组会返回一个字符串?

时间:2017-11-15 11:37:01

标签: javascript arrays string add

var array = [1,2,4];

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

任何人都可以解释这种行为吗?

5 个答案:

答案 0 :(得分:4)

将数组转换为字符串 - 然后与整数值连接,该值也会转换为字符串。

答案 1 :(得分:3)

  

任何人都可以解释这种行为吗?

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

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

  
      
  1. 让lprim为ToPrimitive(lval)。
  2.   
  3. 让rprim为ToPrimitive(rval)。
  4.   

toPrimitive尝试将hint:number(自算术评估期间调用)传递给 OrdinaryToPrimitive

  
      
  1. 如果提示是“字符串”,则为   一个。让methodNames为«“toString”,“valueOf”»。
  2.   
  3. 否则,
      湾让methodNames为«“valueOf”,“toString”»。 //这被调用
  4.   

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

因此

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

你还没有为数组写过一个mutator,你向数组添加了1(这是一个对象)。为什么期望对象能够为它添加1?

JS发现你需要来自该对象的原语并将该对象列入字符串。现在它知道如何“添加”2个字符串(正好是它的连接),所以它确实如此。

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

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

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

或者在ES6中以及带有地图的箭头功能

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

答案 4 :(得分:0)

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

数组和数字都可以转换为字符串,这称为强制

如果您想将1添加到数组中,可以执行以下操作:

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