类型转换规则
Number()
- 如果是
Boolean值,true和false将分别被转换为1和0。 - 如果是数字值,只是简单的传入和返回。
- 如果是
null值,返回0。 - 如果是
undefined,返回NaN。 - 如果是字符串,遵循以下规则:
- 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值。
- 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值。
- 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值。
- 如果字符串是空的(不包含任何字符),则将其转换为
0。 - 如果字符串中包含除上述字符以外的字符,则将其转换为
NaN。
- 如果是对象,则调用对象的
valueOf()方法,然后依照前面的规则转换返回值。如果转换的结果是NaN,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。
parseInt
- 忽略字符串前面的空格,直到找到第一个非空字符。
- 如果第一个字符不是数字字符或者符号,返回
NaN。parseInt转换空字符安返回NaN。 parseInt第二个参数定义了转换使用的基数(即多少进制),第二个参数可以接受 2 和 36 之间的整数。
parseFloat
- 忽略字符串前面的空格,直到找到第一个非空字符。
- 如果第一个字符不是数字字符或者符号,返回
NaN。parseFloat转换空字符安返回NaN。 - 字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。
- 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后面都是零),parseFloat()会返回整数。
parseFloat只解析 10 进制。
String()
- 如果值有
toString()方法,则调用该方法(没有参数)并返回相应的结果。 - 如果值为
null,则返回"null"。 - 如果值为
undefined,则返回"undefined"。
++ 和 -- 操作符
- 在应用一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。
- 在应用一个不包含有效数字字符的字符串时,将变量的值设置为
NaN。 - 在应用于布尔值
false时,先将其转换为0再执行加减1的操作。 - 在应用于布尔值
true时,先将其转换为1再执行加减1的操作。 - 在应用于浮点数值时,执行加减
1的操作。 - 在应用于对象时,先调用对象的
valueOf()方法,以取得一个可供操作的值。然后应用上述规则,如果结果为NaN,则调用对象的toString()方法,再应用上述规则。
一元加减操作符
类似于 Number() 转换规则。
逻辑非( ! )
- 如果操作数是一个对象,返回
false。 - 如果操作数是一个空字符串,返回
true。 - 如果操作数是一个非空字符串,返回
false。 - 如果操作数是数值
0,返回true。 - 如果操作数是任意非
0数值(包括Infinity),返回false。 - 如果操作数是
null,返回true。 - 如果操作数是
NaN,返回true。 - 如果操作数是
undefined,返回true。
逻辑与( && )
- 如果第一个操作数是对象,则返回第二个操作数。
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为
true的情况下,才返回该对象。 - 如果两个操作数都是对象,则返回第二个操作数。
- 如果有一个操作数为
null,则返回null。 - 如果有一个操作数为
NaN,则返回NaN。 - 如果有一个操作数为
undefined,则返回undefined。
逻辑或( || )
- 如果第一个操作数是对象,则返回第一个操作数。
- 如果第一个操作数的求值结果为
false,则返回第二个操作数。 - 如果两个操作数都是对象,则返回第一个操作数。
- 如果两个操作数都为
null, 则返回null。 - 如果两个操作数都为
NaN,则返回NaN。 - 如果两个操作数都是
undefined,则返回undefined。
乘法( * )
- 如果操作数都是数值,执行常规的乘法计算,如果计算结果超过数值范围,则返回
Infinity或-Infinity。 - 如果有一个操作数是
NaN,则结果是NaN。 - 如果是
Infinity和0相乘,结果是NaN。 - 如果是
Infinity和非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号。 - 如果是
Infinity和Infinity相乘,结果是Infinity。 - 如果有一个操作数不是数值,则在后台调用
Number()将其转换为数值,然后再应用上面的规则。
除法( / )
- 如果操作数都是数值,执行常规的乘法计算,如果计算结果超过数值范围,则返回
Infinity或-Infinity。 - 如果有一个操作数是
NaN,则结果是NaN。 - 如果是
Infinity被Infinity除,则结果是NaN。 - 如果是
0被0除,则结果是NaN。 - 如果是非
0的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号。 - 如果是
Infinity被任何非0数值除,则结果是Infinity或-Infinity。 - 如果有一个操作数不是数值,则在后台调用
Number()将其转换为数值,然后再应用上面的规则。
取余( % )
- 如果操作数都是数值,执行常规的除法计算,返回除得的余数。
- 如果被除数是无穷大值,而除数是有限大的数值,则结果是
NaN。 - 如果被除数是有限大的数值,而除数是
0,则结果是NaN。 - 如果是
Infinity被Infinity除,则结果是NaN。 - 如果被除数是有限大的数值,而除数是无穷大的数值,则结果是被除数。
- 如果被除数是
0,则结果是0。 - 如果有一个操作数不是数值,则在后台调用
Number()将其转换为数值,然后再应用上面的规则。
加法( + )
- 如果两个操作符都是数值,执行常规的加法计算,然后分别以下规则返回结果。
- 如果有一个操作数是
NaN,则结果是NaN。 - 如果是
Infinity加Infinity,则结果是Infinity。 - 如果是
-Infinity加-Infinity,则结果是-Infinity。 - 如果是
Infinity加-Infinity,则结果是NaN。 - 如果是
+0加+0,则结果是+0。 - 如果是
-0加-0,则结果是-0。 - 如果是
+0加-0,则结果是+0。
- 如果有一个操作数是
- 如果有一个操作数是字符串,应用如下规则:
- 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接。
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后拼接。
- 如果有一个操作数是对象、数值或布尔值,则调用它们的
toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined和null,分别调用String()函数并取得字符串"undefined"和"null"。
减法( - )
- 如果两个操作符都是数值,执行常规的减法计算,然后分别以下规则返回结果。
- 如果有一个操作数是
NaN,则结果是NaN。 - 如果是
Infinity减Infinity,则结果是NaN。 - 如果是
-Infinity减-Infinity,则结果是NaN。 - 如果是
Infinity减-Infinity,则结果是Infinity。 - 如果是
-Infinity减Infinity,则结果是-Infinity。 - 如果是
+0减+0,则结果是+0。 - 如果是
+0减-0,则结果是-0。 - 如果是
-0减-0,则结果是+0。 - 如果有一个操作数是字符串、布尔值、
null或undefined,则先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN。 - 如果有一个操作数是对象,则调用对象的
valueOf()方法以取得表示该对象的数值。如果得到的值是 NaN,则减法的结果为 NaN。如果对象没有valueOf()方法,则调用toString()方法并将取得的字符串转换为数值。
关系操作符(>=、>、<、<=)
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符串编码。
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后进行数值比较。
- 如果一个操作数是对象,则调用对象的
valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。 - 如果一个操作数是布尔值,则将其转换为数值,再进行比较。
相等和不相等( == 或 != )
- 如果有一个操作数是布尔值,则将其转换为数值,再进行比较。
- 如果有一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
- 如果一个操作数是对象,另一个不是,则调用对象的
valueOf()方法,用得到的基本类型值按照前面的规则进行比较。 null和undefined相等。- 要比较相等性之前,不能将
null和undefined转换为其他任何值。 - 如果有一个操作数是 NaN,则相等性操作符返回
false,不相等性操作符返回true。 - 如果两个操作数都是对象,则比较它们是不是同一个对象。