为什么Javascript isNaN函数将字符串负十六进制值声明为NaN
Why does Javascript isNaN function declare string negative hex values to be NaN?
给定以下示例:
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将负十六进制字符串声明为NaN?
感谢
函数isNaN()
告诉您一个值是否可以被强制为一个数字,它没有说明是否存在将该值转换为数字的函数。
如果你试图将字符串强制为数字,你会看到同样的行为:
> +"-0x123"
NaN
> +(-0x123)
-291
> +"0x123"
291
第一种情况下,您的字符串与Javascript的数字规则不匹配,因为它不允许在十六进制文字上使用前导-
,第二种情况下您的表达式计算结果为数字(因此0x123
取反),第三种情况下的字符串与数字的语法不匹配。
请参阅http://www.ecma-international.org/ecma-262/5.1/#sec-9.3,但简而言之,字符串数字文本可以是无符号十进制文本、+
或-
,后面跟着无符号十进制文字,也可以是十六进制整数文本(在所有这些情况下,忽略前导和尾随空格)。十六进制文字上没有符号选项。
您所期望的是:
isNaN(parseInt("-0x123")); // returns -291
因为"-0x123";被视为字符串而不是数字。所以
isNaN("-0x123");
将返回false,因为没有数字。MDN说:
函数的作用是确定一个值是否为NaN。注:isNaN函数内部的强制有一些有趣的规则;你可以或者想要使用Number。
混淆的特殊情况行为
由于isNaN函数规范的最早版本,它对非数字参数的行为一直令人困惑。当isNaN函数的参数不是Number类型,值为首先被强制为数字。然后将得到的值测试为确定是否为NaN。因此,对于非数字,当被强迫numeric类型会导致一个有效的非NaN数值(尤其是空字符串和布尔基元,当被强制时会给出数字值0或1);false";返回的值可能是意外的;这个例如,空字符串肯定是";不是数字"混乱源于这样一个事实,即术语";不是数字";,具有特定意思是表示为IEEE-754浮点值的数字。这个函数应被解释为回答问题;这是吗值,当强制为数值时,为IEEE-754"非数字"价值"
- 文本框应该只允许十六进制值
- 正在将unicode转换为十六进制
- 在js中将字符串转换为十六进制
- 如何在JavaScript中将数字表示为十六进制
- 带有 TCP/IP 通信的 JavaScript 十六进制代码
- 用Javascript正则表达式过滤十六进制数字
- 如何创建和递增2或3位十六进制数字
- 将html代码转换为十六进制
- 如何检查十六进制颜色是否为“”;太黑”;
- 将十六进制字符串转换为字节数组
- 解码十六进制编码/混淆的javascript
- 如何在HTML5 / javascript中查找十六进制值的特定位或数字
- 节点.js从 UTF8 文件创建十六进制缓冲区
- 从引导程序图标十六进制值输出一个符号
- 将Hsl转换为rgb和十六进制
- javascript:搜索并用不同的颜色代码替换十六进制颜色代码
- JavaScript 中两个十六进制字符串的 XOR
- 在JavaScript/NodeJS中压缩十六进制字符串
- 无需Javascript内置函数即可将十进制转换为十六进制
- 为什么Javascript isNaN函数将字符串负十六进制值声明为NaN