为什么将数组添加到 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,4
与 1
连接是 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,在 +
的 运行 时间求值期间,两个表达式(左和右)都被转换为其原始值。
- Let lprim be ToPrimitive(lval).
- Let rprim be ToPrimitive(rval).
toPrimitive 尝试将 hint:number
(因为在 算术求值 期间调用)传递给 OrdinaryToPrimitive
- If hint is "string", then
a. Let methodNames be «"toString", "valueOf"».
- 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"
var array = [1,2,4];
array+1 //gives '1,2,41'.
谁能解释一下这种行为?
数组转换为字符串 - 然后与也转换为字符串的整数值连接。
当您将 +
符号与已声明的 javascipt 对象 (var array
) 一起使用时,即使其中一个元素是数字,它也不会执行 算术运算 加法运算 - 它 将值连接 为两个 字符串 。
在您的示例中,您的数组 [1,2,4]
被转换为值为 1,2,4
的字符串。所以 1,2,4
与 1
连接是 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,在 +
的 运行 时间求值期间,两个表达式(左和右)都被转换为其原始值。
- Let lprim be ToPrimitive(lval).
- Let rprim be ToPrimitive(rval).
toPrimitive 尝试将 hint:number
(因为在 算术求值 期间调用)传递给 OrdinaryToPrimitive
- If hint is "string", then
a. Let methodNames be «"toString", "valueOf"».- 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"