Appearance
隐式转换
隐式转换规则
1. 转换成字符串
+
字符串连接符
js
let a = 1 + '1'; // '11'
2. 转成 number 类型
- ++/--(自增自减运算符)
js
let a = '1'; //
let a1 = ++a; // a1 = 2
console.log(a1);
-
、-
、/
、%
(算术运算符)
js
let b1 = '1';
let b2 = 1;
console.log(b1 - b2); // 0
console.log(b1 * b2); // 1
console.log(b1 / b2); // 1
- 关系运算符
js
console.log('2' > 10);
console.log('20' > '10');
console.log('2' > 10);
console.log('2' > 10);
console.log('2' > 10);
3. 转换成 Boolean
- if
js
if ('1') {
console.log(true);
}
坑
- 逻辑非隐式转换与关系运算符隐式转换搞混淆
js
console.log([] == 0);
console.log(![] == 0);
console.log({} == !{}); //flase
console.log({} == {}); //flase
在 == 比较规则中如果两边都不是引用类型的,那么就会调用对象类型的 toString 或者 valueOf 方法去转换成字符串或者数字;
其他的都是按照转换成数字的方式去比较的;
解读
[] == 0
[].toString() === '',然后字符串与数字 0 比较,会将字符串转换成数字 '' -> 0,然后 0 === 0;
![] == 0
逻辑非的优先级高于 == ,所以
![] === false
false === 0
{} == !{}
逻辑非的优先级高于 ==, 所以
!{} === false
{}.toString() === "[object Object]"
,所以为 false
{} == {}
- 对象类型的直接地址比较,所以为 false