为什么Javascript isNaN函数将字符串负十六进制值声明为NaN?

为什么Javascript isNaN函数将字符串负十六进制值声明为NaN?,javascript,Javascript,给出以下示例: isNaN("-0x123"); // returns true , meaning is not a number <- Why? isNaN(-0x123); // returns false, meaning is a number isNaN("0x123"); // returns false, meaning is a number parseInt("-0x123"); // returns -291 isNaN(“-0x123”);

给出以下示例:

isNaN("-0x123");    // returns true , meaning is not a number <- Why?
isNaN(-0x123);      // returns false, meaning is a number
isNaN("0x123");     // returns false, meaning is a number
parseInt("-0x123"); // returns -291
isNaN(“-0x123”);//返回true,表示不是数字,因为“-0x123”被视为字符串而不是数字。所以

isNaN("-0x123");
将返回false,因为没有数字。报告说:

函数的作用是:确定值是否为NaN。注: isNaN函数内部的强制具有有趣的规则;你可以 或者,您想使用数字

混淆特殊情况行为

由于最早版本的isNaN功能规范, 它对非数值参数的行为令人困惑。当 isNaN函数的参数不是Number类型,值为 第一个被强迫的数字。然后,将结果值测试为 确定它是否为NaN。因此,对于非数字,当强制 数值类型会导致有效的非NaN数值(尤其是 空字符串和布尔基元,强制时会给出数值 值0或1),返回的“false”值可能是意外的;这个 例如,空字符串肯定是“不是数字” 源于“不是数字”一词有一个特定的含义 表示为IEEE-754浮点值的数字的含义。这个 这个函数应该被解释为回答这样一个问题:“这是吗?” 值,当强制为数值时,IEEE-754“不是数字” 价值?”

函数
isNaN()
告诉您一个值是否可以强制转换为一个数字,它没有说明是否存在一个将值转换为数字的函数

如果尝试将字符串强制为数字,则会看到相同的行为:

> +"-0x123"
NaN
> +(-0x123)
-291
> +"0x123"
291
第一种情况下,您的字符串与Javascript的数字规则不匹配,因为它不允许十六进制文字上的前导
-
,第二种情况下,您的表达式计算为数字(因此
0x123
否定),第三种情况下,您的字符串与数字的语法匹配


请参阅以了解确切的描述,但简而言之,字符串数字文字可以是无符号十进制文字、
+
-
后跟无符号十进制文字,也可以是十六进制整数文字(在所有这些情况下,前导和尾随空格都被忽略)。十六进制文字上没有符号选项。

您所期望的是:

isNaN(parseInt("-0x123")); // returns -291

电话
ToNumber
具有数字格式的预定义规则集,该规则集只允许对十进制数字表示使用
+/-
。和
0x123
不是一个。感谢您参考ToNumber文档。你知道设计师为什么选择省略带符号的字符串十六进制文字吗?@nivla12345我可以猜,但我不知道。也许他们希望您使用十六进制值来表示位模式之类的内容,所以如果您使用16位2的补码值,您将写入0xfffe,而-0x2将是不明确的。好吧,这听起来很合理。