Skip to content

隐式转换

隐式转换规则

1. 转换成字符串

  1. +字符串连接符
js
let a = 1 + '1'; // '11'

2. 转成 number 类型

  1. ++/--(自增自减运算符)
js
let a = '1'; //
let a1 = ++a; //  a1 = 2

console.log(a1);
  1. --/%(算术运算符)
js
let b1 = '1';
let b2 = 1;

console.log(b1 - b2); // 0
console.log(b1 * b2); // 1
console.log(b1 / b2); // 1
  1. 关系运算符
js
console.log('2' > 10);
console.log('20' > '10');
console.log('2' > 10);
console.log('2' > 10);
console.log('2' > 10);

3. 转换成 Boolean

  1. if
js
if ('1') {
	console.log(true);
}

  1. 逻辑非隐式转换与关系运算符隐式转换搞混淆
js
console.log([] == 0);
console.log(![] == 0);
console.log({} == !{}); //flase
console.log({} == {}); //flase

在 == 比较规则中如果两边都不是引用类型的,那么就会调用对象类型的 toString 或者 valueOf 方法去转换成字符串或者数字;

其他的都是按照转换成数字的方式去比较的;

解读

  1. [] == 0

[].toString() === '',然后字符串与数字 0 比较,会将字符串转换成数字 '' -> 0,然后 0 === 0;

  1. ![] == 0
  • 逻辑非的优先级高于 == ,所以 ![] === false

  • false === 0

  1. {} == !{}
  • 逻辑非的优先级高于 ==, 所以 !{} === false

  • {}.toString() === "[object Object]" ,所以为 false

  1. {} == {}
  • 对象类型的直接地址比较,所以为 false