隐式数据类型转换
js
中的数据类型是非常弱的,在使用算数运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和一个数字相加。之所以不同的数据类型之间可以做运算,是因为js
引擎在运算之前会悄悄地把他们进行了隐式类型转换。
常见的一些转换
原始值 | 转化为值类型 | 转化为字符串 | 转化为Boolean |
---|---|---|---|
false | 0 | “false” | false |
true | 1 | “true” | true |
0 | 0 | “0” | false |
1 | 1 | “1” | true |
“0” | 0 | “0” | true |
NaN | NaN | “NaN” | false |
Infinity | Infinity | “Infinity” | true |
“” | 0 | “” | false |
[ ] | 0 | “” | true |
[20] | 20 | “20” | true |
function(){} | NaN | “function(){}” | true |
{} | NaN | “[object Object]” | true |
null | 0 | “null” | false |
undefined | NaN | “undefined” | false |
比较运算
js
为我们提供了严格比较与类型转换比较两种模式
严格比较(== =): 只会在操作符两侧的操作对象类型一致,并且内容一致时才会返回true
,否则返回false。
而更为广泛使用的类型转换比较==: 操作符则会首先将操作对象转化为相同类型,在进行比较。
相等操作符会对操作值进行隐式转换后进行比较:
- 如果一个操作值为布尔值,则在比较之前先将其转换为数值
- 如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
- 如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
- null==undefined——>true
- null===undefined——>false
- 如果一个操作值为NaN,则相等比较返回false
- 如果两个操作值都是对象,则比较它们是不是指向同一个对象
加法运算:
加法运算符在js
中也用作字符串拼接,所以加法操作符的规则分为两种
- 如果一个数是NaN,则结果就是NaN
- 如果是Infinity+Infinity,结果是Infinity
- 如果是-Infinity+(-Infinity),结果是-Infinity
- 如果是Infinity+(-Infinity),结果是NaN
如果有一个操作值是字符串,则: - 如果两个都是字符串则,拼接起来
- 既有字符串,又有数值,则将另外的值转换成字符串,然后拼接起来
- 如果有一个值是对象、数值或者布尔值,则调用
toString()
方法取得字符串值,然后再应用前面的字符串规则。对于undefined和null,分别调用String()显式转换为字符串。
逻辑操作符(!、&&、||)
逻辑非(!)操作符首先通过Boolean()函数将它的操作值转换为布尔值,然后求反。
逻辑与(&&)操作符,如果一个操作值不是布尔值时,遵循以下规则进行转换:
- 如果第一个操作数经Boolean()转换后为true,则返回第二个操作值,否则返回第一个值(不是Boolean()转换后的值)
- 如果有一个操作值为null,返回null
- 如果有一个操作值为NaN,返回NaN
- 如果有一个操作值为undefined,返回undefined
console.log(null&&NaN);//null
console.log(NaN&&null);//NaN
console.log(undefined&&null);//undefined
console.log(null&&undefined);//null
逻辑或(||)操作符,如果一个操作值不是布尔值,遵循以下规则:
- 如果第一个操作值经Boolean()转换后为false,则返回第二个操作值,否则返回第一个操作值(不是Boolean()转换后的值)
- 对于undefined、null和NaN的处理规则与逻辑与(&&)相同
关系操作符(<, >, <=, >=)
与上述操作符一样,关系操作符的操作值也可以是任意类型的,所以使用非数值类型参与比较时也需要系统进行隐式类型转换:
- 如果两个操作值都是数值,则进行数值比较
- 如果两个操作值都是字符串,则比较字符串对应的字符编码值
- 如果只有一个操作值是数值,则将另一个操作值转换为数值,进行数值比较
- 如果一个操作数是对象,则调用valueOf()方法(如果对象没有valueOf()方法则调用toString()方法),得到的结果按照前面的规则执行比较
- 如果一个操作值是布尔值,则将其转换为数值,再进行比较
参考博客:https://www.cnblogs.com/mengxiangji/p/11080006.html