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



