我正在尝试将来自 HTML 文本字段的值与整数进行比较。它按预期工作。条件是——
x >= 1 && x <= 999;
x
文本字段的值在哪里。条件true
在值介于 1-999(含)之间时返回,否则返回false
。问题是,来自文本字段的值是字符串类型,我将它与整数类型进行比较。可以这样进行比较还是应该使用 parseInt() 转换x
为 integer ?
我正在尝试将来自 HTML 文本字段的值与整数进行比较。它按预期工作。条件是——
x >= 1 && x <= 999;
x
文本字段的值在哪里。条件true
在值介于 1-999(含)之间时返回,否则返回false
。问题是,来自文本字段的值是字符串类型,我将它与整数类型进行比较。可以这样进行比较还是应该使用 parseInt() 转换x
为 integer ?
因为 JavaScript 定义>=
和<=
(以及其他几个运算符)的方式允许它们将其操作数强制转换为不同的类型。这只是运算符定义的一部分。
在, , 和的情况下<
,详细信息在规范的 §11.8.5中列出。简短版本是:如果两个操作数都是字符串(如有必要,在从对象强制转换之后),它会进行字符串比较。否则,它将操作数强制转换为数字并进行数字比较。>
<=
>=
因此,你会得到有趣的结果,就像这样"90" > "100"
(两者都是字符串,它是一个字符串比较)但是"90" < 100
(其中一个是一个数字,它是一个数字比较)。:-)
可以这样进行比较还是应该使用 parseInt() 将 x 转换为整数?
这是一个见仁见智的问题。有些人认为依靠隐性强制完全没问题;其他人认为不是。有一些客观的论据。例如,假设您依赖于隐式转换,这很好,因为您拥有这些数字常量,但后来您x
要与从输入字段获得的另一个值进行比较。现在您正在比较字符串,但代码看起来相同。但同样,这是一个意见问题,您应该做出自己的选择。
如果你决定明确转换为数字第一,parseInt
可能是也可能不是你想要什么,它不会做同样的事情,隐式转换。以下是选项的概要:
parseInt(str[, radix])
- 将尽可能多的字符串开头转换为整数(整数),忽略末尾的额外字符。所以parseInt("10x")
是10
; 该x
被忽略。支持可选的基数(数字基数)参数,(十六进制)parseInt("15", 16)
也是如此。如果没有基数,则假定为十进制,除非字符串以(或)开头,在这种情况下,它会跳过这些并假定为十六进制。难道不是寻找新的(二进制)或(新款八进制)前缀; 两者都解析为. (一些浏览器曾经将字符串以八进制开头;这种行为从未被指定,并且在 ES5 规范中[特别禁止][2]。)返回21
15
0x
0X
0b
0o
0
0
NaN
如果没有找到可解析的数字。
Number.parseInt(str[, radix])
- 与parseInt
上述功能完全相同。(字面意思Number.parseInt === parseInt
是true
。)
parseFloat(str)
- 类似parseInt
,但可以处理浮点数并且只支持十进制。再串上多余的字符被忽略,所以parseFloat("10.5x")
是10.5
(将x
被忽略)。由于仅支持十进制,parseFloat("0x15")
is 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位的整数(转换和数字NaN
到0
如果字符串不能被转换为有效的数)。
因此,如果可以忽略字符串上的额外位,parseInt
或者没问题parseFloat
。parseInt
对于指定基数非常方便。一元+
对于确保考虑整个字符串很有用。接受你的选择。:-)
最后:如果您要转换为数字并想知道结果是否为NaN
,您可能很想这样做if (convertedValue === NaN)
。但这行不通,因为正如 Rick在下面指出的那样,涉及的NaN
比较总是错误的。相反,它是if (isNaN(convertedValue))
.
该MDN对比较文档指出,操作数比较(与您正在使用的运营商)之前转换为通用类型:
更常用的抽象比较(例如==)在进行比较之前将操作数转换为相同的类型。对于关系抽象比较(例如,<=),在比较之前,操作数首先转换为原语,然后转换为相同的类型。
只有parseInt()
在使用严格比较时才需要申请,在比较之前不会执行自动转换。
parseInt
如果 var 是字符串,您应该使用。添加 = 来比较datatype
值:
parseInt(x) >== 1 && parseInt(x) <== 999;