JS的隐式类型转换

35 阅读1分钟

js的隐式类型转换分为3种

  1. 关于双目运算符+号的类型转换
  2. 关于==号的类型转换
  3. 其他的类型转换(减,乘,除,单目运算符+等)

+的类型转换口诀

  1. 有string就拼接,没有string转number,
  2. 引用类型,先转原始类型,再按规则走。

==的类型转换口诀

  1. string和number,string转number
  2. 布尔遇到任意类型,布尔转数字
  3. 对象和string或number,对象先转原始类型,再按规则走
  4. null==undefined为true,这是规定
  5. 对象和对象,比较引用地址
  6. NaN和所有值不相等,包括它自己

其他的运算符号类型的转换

  1. 直接转number

引用类型怎么转原始类型

  1. 引用类型,先调用valueOf()函数,然后判断是否是原始类型,如果是,那就转原始类型成功了
  2. 如果不是,再调用toString()函数,变成原始类型
  3. 如果数组自定义了valueOf和toString方法,它不会调用自定义的方法,会调用默认的valueOf和toString方法。
  4. 但是如果是对象自定义了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