为什么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将是不明确的。好吧,这听起来很合理。