类型
- null
- undefined
- boolean
- number
- string
- symbol
装箱
当字面量直接调用其对应的对象方法的时候,称为装箱
var a = 'this is string'
a.length // a自动装箱到对象String中
拆封
在需要用到对象的基本类型值的时候,称为拆封(拆箱)
var a = new Stringl('This is string object');
a.valueOf() // 这个过程称为拆箱
类型转换
ToPrimitive过程
类型 | 结果 |
---|---|
undefined | 不转换 |
null | 不转换 |
boolean | 不转换 |
number | 不转换 |
string | 不转换 |
object | 首先调用[[DefaultValue]],检查该值是否有valueOf()方法,如果有并且是基本类型,就使用该值,如果没有就继续调用toString()进行强制类型转换。如果这两个方法都没有,则产生TypeError错误 |
ToString过程
类型 | 结果 |
---|---|
undefined | 'undefined' |
null | 'null' |
boolean | 'true' or 'false' |
number | 参见StringToNumber过程 |
string | 不转换 |
object | 参见ToPrimitive过程 |
StringToNumber过程
数字值 | 返回的字符串值 |
---|---|
NaN |
'NaN' |
+0 or-0 |
0 |
负数 | '-2' |
Infinity | 'Infinity' |
一些极小或者极大的值1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 |
科学计数法1.07e21 |
ToNumber过程
类型 | 结果 |
---|---|
undefined | NaN |
null | +0 |
boolean | true is 1 or false is 0 |
number | 不需要转换 |
string | 参见NumberToString过程 |
object | 参见ToPrimitive过程 |
NumberToString过程
ToBoolean过程
假值
- undefined
- NaN 0 -0
- null
- false
- ’’
上述在js语言中会背判别为假,剩余的值则会判别为真
类型 | 结果 |
---|---|
undefined | false |
null | false |
boolean | 不转换 |
number | 0 -0 NaN to false other true |
string | '' to false other true |
object | true |
隐式类型转换
宽松等于类型转换过程
- 字符串和数字之间的相等比较
x == y
,字符串一侧走ToNumber
过程 - 其他类型和布尔值之间的比较
x == y
,布尔值一侧走ToNumber
过程 - 对象和非对象之间的转换
x == y
,对象一侧走ToPrimitive
过程 - null 和 undefined之间的比较
x == y
,无论null是x一侧还是y一侧,结果都为true
+符号的类型转换
- 其他类型与字符串相加的时候,其他类型都走
ToString
过程 - 只有字符串和符号+的时候,走
ToNumber
过程
注意❗
- +’123123’ -> 123123 反向不成立 ‘123123’+ 语法错误
- ‘123123’+100 -> ‘123123100’ 反向成立 ‘100123123’
符号类型Symbol
- Symbol -> Boolean 总是true
- Symbol X-> Number
- Symbol -> String
var s1 = Symbol('cool'); new String(s1) // 'Symbol(cool)'
var s1 = Symbol('cool'); s1+''; // TypeError
符号类型转字符串无法使用+符号进行隐式类型转换
boolean类型的转换
if()
for(;;)
while()
ordo while
? :
三目运算||
or&&
的结果
比较关系中的类型转换 >
,<
,>=
,<=
双方都先进行ToPrimitive
过程,然后进行比较
// 此处有一个巨大无比的坑❗❗❗❗❗❗
var a = {b:42};
var b = {b:43};
a < b // false
a == b // false
a > b // false
a <= b // true
a >=b // true
按照书中的逻辑,a < b
是false,反之则是a>=b
是true what fuck