1. JS内置函数转换
1.1 Boolean() 布尔类型转换
在使用Boolean()函数转换只有6中可以转换成false,其余都转换成true
console.log(Boolean(false)); // false
console.log(Boolean(0)); // false
console.log(Boolean(+0)) // false
console.log(Boolean(-0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean("")); // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
1.2 数字类型转换
原始类型转换成数字类型有几个函数可以进行使用,如下
Number()
对于Number()函数,对true和false转换成1和0,对于数字+其他字符就会转换成NaN,
console.log(Number(false)); // 0
console.log(Number(true)); // 1
console.log(Number("sfdsfsd999")); // NaN
console.log(Number("990")); // 990
console.log(Number("433s")); // NaN
console.log(Number("ewr")); // NaN
console.log(Number("343.343")); // 343.343
parseInt()和parseFloat()函数
如果通过 Number 转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导的 0,如果有一个字符不是数字,结果都会返回 NaN,鉴于这种严格的判断,我们一般还会使用更加灵活的 parseInt 和 parseFloat 进行转换。
parseInt 只解析整数,parseFloat 则可以解析整数和浮点数,如果字符串前缀是 "0x" 或者"0X",parseInt 将其解释为十六进制数,parseInt 和 parseFloat 都会跳过任意数量的前导空格,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,将最终返回 NaN:
console.log(parseFloat("3.14 abc")) // 3.14
console.log(parseInt("-12.34")) // -12
console.log(parseInt("0xFF")) // 255
console.log(parseFloat(".1")) // 0.1
console.log(parseInt("0.1")) // 0
1.3 原始类型转字符串 String()
console.log(String(undefined)) // undefined
console.log(String(null)) // null
console.log(String(false)) // false
console.log(String(true)) // true
console.log(String(0)) // 0
console.log(String(-0)) // 0
console.log(String(NaN)) // NaN
console.log(String(Infinity)) // Infinity
console.log(String(-Infinity)) // -Infinity
console.log(String(1)) // 1
2 隐式转换
一元操作符 +
- 如果
obj为基本类型,直接返回 - 否则,调用
valueOf方法,如果返回一个原始值,则JavaScript将其返回。 - 否则,调用
toString方法,如果返回一个原始值,则JavaScript将其返回。 - 否则,
JavaScript抛出一个类型错误异常。
console.log(+[]); // 0
console.log(+[1]); // 1
二院操作符 +
简单就是将两边如果有一边是字符串那么转换成字符串进行拼接,否则调用ToNumber()进行运算
- lprim = ToPrimitive(value1)
- rprim = ToPrimitive(value2)
- 如果 lprim 是字符串或者 rprim 是字符串,那么返回 ToString(lprim) 和 ToString(rprim)的拼接结果
- 返回 ToNumber(lprim) 和 ToNumber(rprim)的运算结果
console.log([] + []); // ""
console.log([] + {}); // [object Object]
console.log({} + []); // [object Object]
== 运算符
当执行x == y 时:
- 如果x与y是同一类型:
- x是Undefined,返回true
- x是Null,返回true
- x是数字:
- x是NaN,返回false
- y是NaN,返回false
- x与y相等,返回true
- x是+0,y是-0,返回true
- x是-0,y是+0,返回true
- 返回false
- x是字符串,完全相等返回true,否则返回false
- x是布尔值,x和y都是true或者false,返回true,否则返回false
- x和y指向同一个对象,返回true,否则返回false
- x是null并且y是undefined,返回true
- x是undefined并且y是null,返回true
- x是数字,y是字符串,判断x == ToNumber(y)
- x是字符串,y是数字,判断ToNumber(x) == y
- x是布尔值,判断ToNumber(x) == y
- y是布尔值,判断x ==ToNumber(y)
- x是字符串或者数字,y是对象,判断x == ToPrimitive(y)
- x是对象,y是字符串或者数字,判断ToPrimitive(x) == y
- 返回false
比较好记的方法: 如果操作数是布尔值,则先转换为数值,其中 false 转为 0,true 转换为 1。 如果一个操作数是字符串,另一个操作数是数字,则先尝试把字符串转换为数字。 如果一个操作数是字符串,另一个操作数是对象,则先尝试把对象转换为字符串。 如果一个操作数是数字,另一个操作数是对象,则先尝试把对象转换为数字。 如果两个操作数都是对象,则比较引用地址。如果引用地址相同,则相等;否则不等。