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
引用类型转原始类型
对象转Null
与Undefined
没有意义,所以我们只聊对象转字符串、数字和布尔值。
1. 对象转布尔值
任何对象转布尔都是true,记住这个结论就好
console.log(Boolean({})); // true
console.log(Boolean([])); // true
2. 对象转数字
先来看看官方文档是怎么说的
大概意思是,你传入一个值,经过ToPrimitive
这样一个函数的调用并返回一个值,这个值会被转换成数字类型ToPrimitive(obj, Number)
英文不咋滴,经过翻译之后我直接把结论总结一下,对象转换成数值就是以下四个步骤:
- 判断obj是基本类型,则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则报类型错误
这里还要了解一点toString()
这个方法,toString()
在js中有多个版本
- {}.toString() 返回
[object class]
class代表对象的具体类型 - 数组的toString()会将所有元素转化成字符串并以逗号拼接
- 函数的toString()会将整个函数体以字符串形式返回
- Date的toString()会将整个date以字符串形式返回
举个例子:
console.log(Number({})) // NaN
-
{}
是一个对象,不是基本类型,进入第二步 -
尝试调用
valueOf
方法,空对象valueOf
方法会返回对象本身,而不是一个原始值,进入第三步。 -
调用
toString
方法 对于普通的空对象{}
,toString
方法通常会返回"[object Object]"
字符串。
调用toString
方法的时候得到了原始值字符串"[object Object]"
,于是ToPrimitive
这个函数将其返回,最后就相当于 Number("[object Object]")
执行了这段代码,相当于将字符串转换成数字,所以最终打印结果为 NaN
。
3. 对象转字符串
与对象转数字类似,唯一的区别就是转字符串时在ToPrimitive
函数中是先调用 toString
方法,后调用 valueOf
方法。
- 判断obj是基本类型,则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则报类型错误
二元运算符 +
简单总结一下就是
lprim = ToPrimitive(v1)
rprim = ToPrimitive(v2)
v1 + v2 === lprim + rprim
- 如果 lprim 是字符串 或者 rprim 是字符串,则返回将不是字符串的一方转为字符串,再进行拼接
- 否则 都转成number 再进行加法运算
读到这里你是不是有一种醍醐灌顶的感觉,如果有的话说明你已经跨过了JS类型转换这一座大山!如果没有的话那就再看几遍就有了