任何带有 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"。非字符串值将被转换为字符串并追加或添加到字符串值之前,具体取决于它是位于运算符的右侧还是左侧(分别)。