跨过JS类型转换这座大山,原来这么简单

104 阅读3分钟

JavaScript中的类型转换和运算符是每位开发者必须深入理解的重要主题。在JavaScript中,存在着许多隐式和显式的类型转换规则,同时运算符的行为也受到这些规则的影响。让我们一起深入探讨这些概念。

隐式类型转换与显式类型转换

先看看下面的例子:

1 == '1'   // true
1 === '1'  // false

JavaScript中的相等运算符 == 当等号两边的数据类型不一致时会进行隐式类型转换,而全等运算符 === 则不进行类型转换。了解它们之间的区别是避免潜在错误的关键。

基本数据类型之间的转换

基本数据类型之间可以相互进行转换,了解他们也是理解类型转换的重要一步

转布尔
console.log(Boolean());     // false
console.log(Boolean('123'));    // true
console.log(Boolean(''));       //false
console.log(Boolean(-1));   // true
console.log(Boolean(0));    // false
console.log(Boolean(undefined));    //false
console.log(Boolean(null));     // false
console.log(Boolean(NaN));      // false


转数字
console.log(Number());          // 0
console.log(Number(false));     // 0
console.log(Number(true));      // 1
console.log(Number('123'));     // 123
console.log(Number(''));        // 0
console.log(Number('hello'));   // NaN
console.log(Number(undefined)); // NaN
console.log(Number(null));      // 0


转字符串
console.log(String());      //空字符
console.log(String(undefined));     //字符串undefined
console.log(String(null));      //字符串null
console.log(String(true));      //字符串true
console.log(String(false));     //字符串false
console.log(String(NaN));       //字符串NaN

引用类型转原始类型

对象转NullUndefined没有意义,所以我们只聊对象转字符串、数字和布尔值。

1. 对象转布尔值

任何对象转布尔都是true,记住这个结论就好

console.log(Boolean({})); // true 
console.log(Boolean([])); // true

2. 对象转数字

先来看看官方文档是怎么说的

image.png

大概意思是,你传入一个值,经过ToPrimitive这样一个函数的调用并返回一个值,这个值会被转换成数字类型ToPrimitive(obj, Number)

image.png

英文不咋滴,经过翻译之后我直接把结论总结一下,对象转换成数值就是以下四个步骤:

  1. 判断obj是基本类型,则返回
  2. 否则调用valueOf()方法,如果得到原始类型,则返回
  3. 否则调用toString()方法,如果得到原始类型,则返回
  4. 否则报类型错误

这里还要了解一点toString()这个方法,toString() 在js中有多个版本

  • {}.toString() 返回[object class] class代表对象的具体类型
  • 数组的toString()会将所有元素转化成字符串并以逗号拼接
  • 函数的toString()会将整个函数体以字符串形式返回
  • Date的toString()会将整个date以字符串形式返回

举个例子:

console.log(Number({}))     // NaN
  1. {} 是一个对象,不是基本类型,进入第二步

  2. 尝试调用 valueOf 方法,空对象 valueOf 方法会返回对象本身,而不是一个原始值,进入第三步。

  3. 调用 toString 方法 对于普通的空对象 {}toString 方法通常会返回 "[object Object]" 字符串。

调用toString方法的时候得到了原始值字符串"[object Object]",于是ToPrimitive这个函数将其返回,最后就相当于 Number("[object Object]") 执行了这段代码,相当于将字符串转换成数字,所以最终打印结果为 NaN

3. 对象转字符串

与对象转数字类似,唯一的区别就是转字符串时在ToPrimitive函数中是先调用 toString 方法,后调用 valueOf 方法。

  1. 判断obj是基本类型,则返回
  2. 否则调用toString()方法,如果得到原始类型,则返回
  3. 否则调用valueOf()方法,如果得到原始类型,则返回
  4. 否则报类型错误

二元运算符 +

image.png 简单总结一下就是

lprim = ToPrimitive(v1)
rprim = ToPrimitive(v2)
v1 + v2 === lprim + rprim
  1. 如果 lprim 是字符串 或者 rprim 是字符串,则返回将不是字符串的一方转为字符串,再进行拼接
  2. 否则 都转成number 再进行加法运算

读到这里你是不是有一种醍醐灌顶的感觉,如果有的话说明你已经跨过了JS类型转换这一座大山!如果没有的话那就再看几遍就有了