js的隐式类型转换分为3种
- 关于双目运算符+号的类型转换
- 关于==号的类型转换
- 其他的类型转换(减,乘,除,单目运算符+等)
+的类型转换口诀
- 有string就拼接,没有string转number,
- 引用类型,先转原始类型,再按规则走。
==的类型转换口诀
- string和number,string转number
- 布尔遇到任意类型,布尔转数字
- 对象和string或number,对象先转原始类型,再按规则走
- null==undefined为true,这是规定
- 对象和对象,比较引用地址
- NaN和所有值不相等,包括它自己
其他的运算符号类型的转换
- 直接转number
引用类型怎么转原始类型
- 引用类型,先调用valueOf()函数,然后判断是否是原始类型,如果是,那就转原始类型成功了
- 如果不是,再调用toString()函数,变成原始类型
- 如果数组自定义了valueOf和toString方法,它不会调用自定义的方法,会调用默认的valueOf和toString方法。
- 但是如果是对象自定义了valueOf和toString,它会调用自定义的方法
测试用例
// 这边都是+的类型转换
console.log("5" + 3);
console.log(true + 1);
console.log([] + []);
console.log({} + 1);
console.log(null + undefined)
// 53
// 2
// ""
// "[object Object]1"
// NaN
// ==的类型转换口诀
console.log(null == undefined);
console.log([0] == false);
console.log([] == ![]);
console.log({} == !{});
// true
// true
// true
// false
// 其他运算符号口诀
console.log("5" - 3);
// 2
// 对象会调用自定义的方法,
const obj = {
valueOf: () => 2,
toString: () => "3"
};
console.log(obj + 1);
console.log(String(obj));
// 3
// "3"
// 数组不会调用自定义的方法
const arr = [1, 2];
arr.valueOf = () => 10;
arr.toString = () => "20";
console.log(arr + 1);
console.log(arr == 10);
// "1,21"
// false