小编典典

为什么字符串与数字比较在Javascript中有效

javascript

我正在尝试将来自HTML文本字段的值与整数进行比较。它按预期工作。条件是-

x >= 1 && x <= 999;

x文本字段的值在哪里。true只要值介于1-999(含)之间,条件就会返回,否则返回false。问题是,来自文本字段的值是字符串类型,我正在将其与整数类型进行比较。可以进行这种比较,还是应该使用parseInt()转换x为整数?


阅读 247

收藏
2020-05-01

共1个答案

小编典典

因为JavaScript 以允许它们将操作数强制转换为不同类型的方式定义>=<=(以及其他几个运算符)。它只是运算符定义的一部分。

在的情况下<><=,和>=,山的详细信息在布局[规范的§11.8.5。简短的版本是:如果两个操作数都是字符串(从对象强制转换后,如果需要的话),它将进行字符串比较。否则,它将操作数强制转换为数字并进行数字比较。

因此,您会得到有趣的结果,就像这样"90" > "100"(都是字符串,这是字符串比较),但是"90" < 100(其中一个是数字,是数字比较)。:-)

可以进行这样的比较,还是应该使用parseInt()将x转换为整数?

这是一个见解。有人认为依靠隐性强制是完全可以的。其他人则认为不是。有一些客观的论点。例如,假设您依赖于隐式转换,这很好,因为您拥有这些数字常量,但后来您将其x与从输入字段中获得的另一个值进行比较。现在,您正在比较字符串,但是代码看起来相同。但同样,这是一个见解,您应该自行选择。

如果你决定明确转换为数字第一,parseInt可能是也可能不是你想要什么,它 不会 做同样的事情,隐式转换。以下是选项的摘要:

  • parseInt(str[, radix])-将字符串的开头尽可能多地转换为整数(整数), 而忽略结尾的多余字符 。所以parseInt("10x")10; 该x被忽略。支持可选的基数(基数)参数,因此parseInt("15", 16)2115十六进制)。如果没有基数,则假定为十进制,除非字符串以0x(或0X)开头,在这种情况下,它将跳过这些并假定为十六进制。难道 不是 寻找新的0b(二进制)或0o(新款八进制)前缀; 两者都解析为0。 _(使用的一些浏览器,以开始治疗的字符串0为八进制;从未指定该行为,并且是[具体不允许] [2]在ES5规范。)_返回NaN 如果找不到可解析的数字。

  • Number.parseInt(str[, radix])-与parseInt上述功能完全相同。(从字面上看Number.parseInt === parseInttrue。)

  • parseFloat(str)-和一样parseInt,但是浮点数并且仅支持十进制。再串上多余的字符被忽略,所以parseFloat("10.5x")10.5(将x被忽略)。由于仅支持十进制,因此parseFloat("0x15")0(因为解析在处结束x)。NaN如果找不到可解析的数字,则返回。

  • Number.parseFloat(str)-与parseFloat上述功能完全相同。

  • 一元+,例如+str- (例如,隐式转换) 使用浮点数和JavaScript的标准数字符号将 整个 字符串转换为数字(仅数字和小数点=十进制;0x前缀=十六进制;0b=二进制[ES2015 +];0o前缀=八进制[ES2015 + ]; 一些 实现将其扩展为将前导0视作八进制,但不是严格模式)。+"10x"NaN因为x 忽略。+"10"10+"10.5"10.5+"0x15"21+"0o10"8[ES2015 +],+"0b101"5[ES2015 +]。有一个陷阱:+""0,不是NaN 如您所料。

  • Number(str)-就像隐式转换一样(例如,像+上面的一元转换一样),但是在某些实现上速度较慢。 (这并不重要。)

  • 按位或与零个,例如str|0-隐式转换,例如+str,但随后又转换成一个32位的整数(转换和数字NaN0如果字符串不能被转换为有效的数)。

因此,如果可以,则可以忽略字符串上多余的位,parseInt或者parseFloat可以。parseInt用于指定基数非常方便。一元+对于确保考虑
整个 字符串很有用。由您选择。:-)

最后,如果您要转换为数字并想知道结果是否为NaN,则可能会想这样做if (convertedValue === NaN)。但这 是行不通的

2020-05-01