基本类型
number,string,boolean,undefined,null,object,symbol
显式转换
转string
number, string, boolean, undefined,null,symbol会以字符串的形式原样貌输出。
object: 会输出为"[object Object]"
转number
使用基本包装类型Number
String
- 数字格式:原样貌输出,例如 Number('123') ==> 123
- 空字符串:输出0,例如Number('') ==> 0
- 其他: 输出NaN, 例如Number('s') ==> NaN
boolean
- true: 1,
- false:
undefined: NaN
null: 0
object:调用object的toString方法,取其返回值进行转换,规则同其他类型。
- 例如 Number({toString() {return ''}}) ==> 0
- 例如 Number({toString() {return 'ss'}}) ==> NaN
symbol: 会报错。报错内容:Cannot convert a Symbol value to a number
使用parseInt
String
- 数字格式:原样貌输出,例如 parseInt('123') ==> 123
- 数字打头:输出前面的数字,例如 parseInt('1s') ==> 1
- 空字符串:输出0,例如parseInt('') ==> NaN
- 其他字符串格式: 输出NaN, 例如parseInt('s') ==> NaN
其他情况:均为NaN
转boolean
String:当字符串长度大于1时转为true,否则false,例如Boolean(' ') ==> true
number:当数字不全为0时转为true,否则false,例如Boolean(0.01) ==> true, Boolean(0.0) ==> false
undefined,null: false
object: 均转为true,例如 Boolean({toString() {return false}})
Symbol: 均转为true,例如 Boolean(Symbol(false))
转Object
number,string,boolean 转为其对应的基本包装类型,例如 Object(1) ==> Number{1}。但是并不相等。
undefined,null: 转换为空对象。例如 Object(undefined) ==> {}
symbol: 转换为symbol包装类型对象【此处解释存疑】。例如 Object(Symbol(12)) ==>
隐式转换
字符串连接+
转换规则:会把其他数据类型调用String()方法转换成字符串然后拼接。
- 例如: 1 + 'true' ==> 1true
+号说明:
- 字符串连接符+:只要+号两边至少有一边是字符串。
- 算术运算符符+:两边都不能是字符串。
算术运算符
算术运算符: (+、-、*、**、/、%) 转换规则:会把其他数据类型调用Number()转换成数字,然后做加法运算。
- 例如: 1 + true ==> 2
关系运算符
转换规则:
- 当关系运算符两边有一边是字符串的时候,会将其他数据类型使用Number转换,然后比较关系。
- 例如:'2' < true ==> false
- 当关系运算符两边都是字符串的时候,会同时转成number,然后比较关系。此时是按照字符串对应的unicode编码来转成的数字。可以使用charCodeAt查询。
- 例如:'aab' < 'abb' ==> true
特殊情况
- undefined == undefined ==> true
- undefined == null ==> true
- null == null ==> true
- NaN == NaN ==> false
复杂数据类型
复杂数据类型:对象、数组
转换规则:先调用valueOf()方法获取其原始值,如果是值类型,则停止继续调用。如果不是值类型,则调用该类型的toString()方法,如果是值类型,则转换为字符串进行比较,如果是复杂数据类型则报错。
- 例如:var a = {
valueOf() {
return 1
},
toString () {
return 2
} },a == 1 ==> true
逻辑非隐式转换
逻辑非:将其他数据类型使用Bollean()转换成布尔类型。
- 例如:
- [] == 0 ==> true
- [].valueOf().toString()得到空字符串
- Number('') === 0
- ![] == 0 ==> true
- 逻辑非优先级高于关系运算符 ![] =false
- false == 0 成立
- ![] == [] ==> true
- 逻辑非优先级高于关系运算符 ![] = false
- [].valueOf().toString()得到空字符串
- Number('') = 0
- false == 0 成立
- [] == [] ==> false
- 引用类型比较的是地址值
- !{} == {} ==> false
- 逻辑非优先级高于关系运算符 !{} = false
- {}.valueOf().toString()得到'[object Object]'
- Number('[object Object]') = NaN
- false == NaN ==> false
- {} == {} ==> false
- 引用类型比较的是地址值
- [] == 0 ==> true
参考地址
