var array = [1,2,4];
array+1 //gives '1,2,41'.
任何人都可以解释这种行为吗?
答案 0 :(得分:4)
将数组转换为字符串 - 然后与整数值连接,该值也会转换为字符串。
答案 1 :(得分:3)
任何人都可以解释这种行为吗?
此答案试图从规范的角度解释此行为。
根据spec,在+
的运行时评估期间,两个表达式(左侧和右侧)都将转换为其原始值。
- 让lprim为ToPrimitive(lval)。
- 让rprim为ToPrimitive(rval)。
醇>
toPrimitive尝试将hint:number
(自算术评估期间调用)传递给 OrdinaryToPrimitive
- 如果提示是“字符串”,则为 一个。让methodNames为«“toString”,“valueOf”»。
- 否则,
醇>
湾让methodNames为«“valueOf”,“toString”»。 //这被调用
由于其中一个值通过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,4
与1
连接的是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);