任何带有 NaN 的算术运算都应该是 MaN
Any arithmatic operation with NaN should be a NaN
我有这样的说法
var x = parseInt(1)+'b';
为什么这个结果是 1b 但 isNAN('b')
返回 true;
所以结果应该是 NaN?
Number + String
不是算术运算。
在Number + String
语句中,引擎会将数字转换为等价的字符串。
在你的情况下它将是 1 -> '1'
。然后将是简单的字符串连接,因为 +
运算符将连接两个字符串。
'1' + 'b' === '1b';
代码段
console.log(1 + 'b');
在 IsNaN('b')
的情况下,它会尝试检测参数是否为数字。 'b'
不是数字 (NaN
),所以它将 return true
.
代码段
console.log(isNaN('b'));
详情请见Documentation
如果任一操作数是字符串,则 +
运算符被定义为串联。
来源:https://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
因为它不是算术运算,所以它是字符串连接。每当 +
的 either 操作数是字符串时,将进行字符串连接而不是加法; details in the spec。如果另一个操作数不是字符串,则将其转换为字符串。所以你最终得到 "1" + "b"
=> "1b"
.
+
运算符,当它有一个字符串作为其参数之一时,将被解释为 "concatenation" 运算符而不是 "addition"。非字符串值将被转换为字符串并追加或添加到字符串值之前,具体取决于它是位于运算符的右侧还是左侧(分别)。
我有这样的说法
var x = parseInt(1)+'b';
为什么这个结果是 1b 但 isNAN('b')
返回 true;
所以结果应该是 NaN?
Number + String
不是算术运算。
在Number + String
语句中,引擎会将数字转换为等价的字符串。
在你的情况下它将是 1 -> '1'
。然后将是简单的字符串连接,因为 +
运算符将连接两个字符串。
'1' + 'b' === '1b';
代码段
console.log(1 + 'b');
在 IsNaN('b')
的情况下,它会尝试检测参数是否为数字。 'b'
不是数字 (NaN
),所以它将 return true
.
代码段
console.log(isNaN('b'));
详情请见Documentation
如果任一操作数是字符串,则 +
运算符被定义为串联。
来源:https://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
因为它不是算术运算,所以它是字符串连接。每当 +
的 either 操作数是字符串时,将进行字符串连接而不是加法; details in the spec。如果另一个操作数不是字符串,则将其转换为字符串。所以你最终得到 "1" + "b"
=> "1b"
.
+
运算符,当它有一个字符串作为其参数之一时,将被解释为 "concatenation" 运算符而不是 "addition"。非字符串值将被转换为字符串并追加或添加到字符串值之前,具体取决于它是位于运算符的右侧还是左侧(分别)。