x >= 1 && x <= 999;
当x
是文本字段的值时,条件返回true
,只要该值在1-999(包括1和999)之间,否则返回false
。
问题在于,从文本字段中获取的值是字符串类型,而我正在将其与整数类型进行比较。这种比较方式是否正确?或者我应该使用parseInt()将x
转换为整数类型?
x >= 1 && x <= 999;
当x
是文本字段的值时,条件返回true
,只要该值在1-999(包括1和999)之间,否则返回false
。
问题在于,从文本字段中获取的值是字符串类型,而我正在将其与整数类型进行比较。这种比较方式是否正确?或者我应该使用parseInt()将x
转换为整数类型?
>=
和<=
(以及其他几个运算符)的方式,使它们可以强制将其操作数转换为不同类型。这只是运算符定义的一部分。<
、>
、<=
和>=
,详细信息在规范的§11.8.5节中有说明。简短的版本是:如果两个操作数都是字符串(在必要时从对象中强制转换),则进行字符串比较。否则,它将操作数强制转换为数字并进行数字比较。"90" > "100"
(它们都是字符串,这是一个字符串比较),但"90" < 100
(其中一个是数字,这是一个数字比较)。 :-)
这是一个观点问题。有些人认为依赖隐式强制转换完全没问题,而另一些人则不这么认为。有一些客观的论据。例如,假设你依赖隐式转换,并且因为你有那些数字常量而没有问题,但后来你将像这样进行比较是否可以,还是应该使用parseInt()将x转换为整数?
x
与从输入字段得到的另一个值进行比较。现在你正在比较字符串,但代码看起来是相同的。但再次强调,这是一个观点问题,你应该自己做出选择。parseInt
可能并不是你想要的,它也不能像隐式转换那样工作。以下是一些选项:
parseInt(str[, radix])
- 将字符串开头尽可能多的部分转换为整数,忽略结尾的额外字符。因此,parseInt("10x")
是 10
;x
被忽略了。支持可选参数 radix(数字基数),所以 parseInt("15", 16)
是 21
(十六进制中的 15
)。如果没有 radix,则默认为十进制,除非字符串以 0x
(或 0X
)开头,这时会跳过它们并假定为十六进制。不会查找新的 0b
(二进制)或 0o
(新式八进制)前缀;两者都解析为 0
。(一些浏览器曾将以 0
开头的字符串视为八进制;这种行为从未被规定,并且在 ES5 规范中[明确禁止][2]。)如果找不到可解析的数字,则返回 NaN
。
Number.parseInt(str[, radix])
- 与上面的 parseInt
函数完全相同。(实际上,Number.parseInt === parseInt
为 true
。)
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)
- 与隐式转换相同(
parseInt
或parseFloat
就可以了。 parseInt
非常方便,可以指定基数。一元运算符+
可用于确保考虑整个字符串。取决于你的选择。 :-)const parseNumber = (str) => str ? +str : NaN;
(或者是修剪空格的变体。)请注意它如何处理+""
等于0
的问题。
最后,如果你要转换为数字并想知道结果是否为NaN
,你可能会尝试做if (convertedValue === NaN)
。但那行不通,因为正如Rick在下面指出的那样,涉及NaN
的比较始终为false。相反,应该使用if (isNaN(convertedValue))
。
NaN
。 NaN
与任何东西(包括它本身)进行比较都是假的。 因此,所有这些表达式都是假的: 'a' == 5
,'a' < 5
,'a' > 5
。 - Rick HitchcockNaN
转换为 0
。我今天刚加上这个功能,显然还没有完全清醒。感谢您的提醒!已修复。 - T.J. Crowder只有在使用严格比较时才需要应用常用的抽象比较 (例如 ==) 在进行比较之前将操作数转换为相同的类型。对于关系型抽象比较 (例如 <=),在比较之前,首先将操作数转换为基元类型,然后转换为相同类型。
parseInt()
,因为它不会在比较之前执行自动转换。如果变量是字符串,您应该使用parseInt
。添加=以比较datatype
值:
parseInt(x) >== 1 && parseInt(x) <== 999;