我正在尝试将来自HTML文本字段的值与整数进行比较。它按预期工作。条件是-
x >= 1 && x <= 999;
x文本字段的值在哪里。true只要值介于1-999(含)之间,条件就会返回,否则返回false。问题是,来自文本字段的值是字符串类型,我正在将其与整数类型进行比较。可以进行这种比较,还是应该使用parseInt()转换x为整数?
x
true
false
因为JavaScript 以允许它们将操作数强制转换为不同类型的方式定义>=和<=(以及其他几个运算符)。它只是运算符定义的一部分。
>=
<=
在的情况下<,>,<=,和>=,山的详细信息在布局[规范的§11.8.5。简短的版本是:如果两个操作数都是字符串(从对象强制转换后,如果需要的话),它将进行字符串比较。否则,它将操作数强制转换为数字并进行数字比较。
<
>
因此,您会得到有趣的结果,就像这样"90" > "100"(都是字符串,这是字符串比较),但是"90" < 100(其中一个是数字,是数字比较)。:-)
"90" > "100"
"90" < 100
可以进行这样的比较,还是应该使用parseInt()将x转换为整数?
这是一个见解。有人认为依靠隐性强制是完全可以的。其他人则认为不是。有一些客观的论点。例如,假设您依赖于隐式转换,这很好,因为您拥有这些数字常量,但后来您将其x与从输入字段中获得的另一个值进行比较。现在,您正在比较字符串,但是代码看起来相同。但同样,这是一个见解,您应该自行选择。
如果你决定明确转换为数字第一,parseInt可能是也可能不是你想要什么,它 不会 做同样的事情,隐式转换。以下是选项的摘要:
parseInt
parseInt(str[, radix])-将字符串的开头尽可能多地转换为整数(整数), 而忽略结尾的多余字符 。所以parseInt("10x")是10; 该x被忽略。支持可选的基数(基数)参数,因此parseInt("15", 16)是21(15十六进制)。如果没有基数,则假定为十进制,除非字符串以0x(或0X)开头,在这种情况下,它将跳过这些并假定为十六进制。难道 不是 寻找新的0b(二进制)或0o(新款八进制)前缀; 两者都解析为0。 _(使用的一些浏览器,以开始治疗的字符串0为八进制;从未指定该行为,并且是[具体不允许] [2]在ES5规范。)_返回NaN 如果找不到可解析的数字。
parseInt(str[, radix])
parseInt("10x")
10
parseInt("15", 16)
21
15
0x
0X
0b
0o
0
NaN
Number.parseInt(str[, radix])-与parseInt上述功能完全相同。(从字面上看Number.parseInt === parseInt是true。)
Number.parseInt(str[, radix])
Number.parseInt === parseInt
parseFloat(str)-和一样parseInt,但是浮点数并且仅支持十进制。再串上多余的字符被忽略,所以parseFloat("10.5x")是10.5(将x被忽略)。由于仅支持十进制,因此parseFloat("0x15")是0(因为解析在处结束x)。NaN如果找不到可解析的数字,则返回。
parseFloat(str)
parseFloat("10.5x")
10.5
parseFloat("0x15")
Number.parseFloat(str)-与parseFloat上述功能完全相同。
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 如您所料。
+
+str
+"10x"
+"10"
+"10.5"
+"0x15"
+"0o10"
8
+"0b101"
5
+""
Number(str)-就像隐式转换一样(例如,像+上面的一元转换一样),但是在某些实现上速度较慢。 (这并不重要。)
Number(str)
按位或与零个,例如str|0-隐式转换,例如+str,但随后又转换成一个32位的整数(转换和数字NaN到0如果字符串不能被转换为有效的数)。
str|0
因此,如果可以,则可以忽略字符串上多余的位,parseInt或者parseFloat可以。parseInt用于指定基数非常方便。一元+对于确保考虑 整个 字符串很有用。由您选择。:-)
最后,如果您要转换为数字并想知道结果是否为NaN,则可能会想这样做if (convertedValue === NaN)。但这 是行不通的
if (convertedValue === NaN)