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

Why does Javascript isNaN function declare string negative hex values to be NaN?

本文关键字:十六进制 声明 NaN 字符串 Javascript isNaN 函数 为什么      更新时间:2023-09-26

给定以下示例:

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

因为&quot-0x123";被视为字符串而不是数字。所以

isNaN("-0x123");

将返回false,因为没有数字。MDN说:

函数的作用是确定一个值是否为NaN。注:isNaN函数内部的强制有一些有趣的规则;你可以或者想要使用Number。

混淆的特殊情况行为

由于isNaN函数规范的最早版本,它对非数字参数的行为一直令人困惑。当isNaN函数的参数不是Number类型,值为首先被强制为数字。然后将得到的值测试为确定是否为NaN。因此,对于非数字,当被强迫numeric类型会导致一个有效的非NaN数值(尤其是空字符串和布尔基元,当被强制时会给出数字值0或1);false";返回的值可能是意外的;这个例如,空字符串肯定是";不是数字"混乱源于这样一个事实,即术语";不是数字";,具有特定意思是表示为IEEE-754浮点值的数字。这个函数应被解释为回答问题;这是吗值,当强制为数值时,为IEEE-754"非数字"价值"