原始值转原始值
number
- Number()
Number(null) == 0
/Number(undefined) == NaN
两个特例:null == undefined
,NaN != NaN
Number(Infinity) == Infinity
,Number(1) == 1
Number(true) == 1
/Number(false) == 0
对于字符串转换
Number("1") == 1
/parseInt("1") == 1
/Number("") == 0
Number("1.567") == 1.567
/parseInt("1.567") == 1
/parseFloat("1.567") == 1.567
Number("0b10") == 2
/parseInt("10", 2) == 2
Number("0o10") == 8
/parseInt("10", 8) == 8
Number("0x10") == 16
/parseInt("10", 16) == 16
Number("010") == 2
/parseInt("010") == 2
Number("-123abc") == NaN
/parseInt("-123abc") == -123
Boolean
除了虚值 falsy 外,所有 Boolean() 都为true
falsy 值 Boolean() 都为 false, 这些值有:
- null
- undefine
- false
- ‘’、””、’’ 空字符串
- 0、+0/-0、0n
- NaN
String
调用原始值包装类的 toString() 方法,null undefined 为 “null” “undefined”加号
左右两边为 number 或 boolean 是运算符号,否则是字符串连接符号+
是运算符号,还是字符串连接符号
:::info 所有引用值在隐式转换时都会转为原始值 :::
对象转 Boolean
除了 falsy,都有 Boolean 都为 true, 所以 Boolean({})
、Boolean([])
都为 true
对象转 Number
对象转 String
隐式转换触发条件
触发转 Number的条件
运算符号 +
、-
、*
、/
、%
位运算 ~
、&
、|
、^
、<<
、>>
、>>>
判断 ==
、!=
、>=
、<=
、<
、>
触发转 Boolean 的条件
if、while、for、!
、?:
、&&
、||
switch 是不会触发隐式转换
触发转 String 的条件
题目
[]+[]
这个加号左右两都不 number 所以是字符串连接符号。
那么两边都要作 String([])
转为字符串,[].toString 为调用原型上 Array.prototype.toString 的方法,其操作的行为是相当于把 []
去掉,然后把内面的内容以 string 来显示。所以 [] 是 ‘’ 空串。
最终结果就是 ‘’ + ‘’ == ‘’,空串连接空串就是空串。
[]+{}
与上一题相似,加号也是字符串连接符号。
[].toString 为 ‘’ 空串;
{}.toString 调用 原型上 Object.prototype.toString 的方法,返回字符串 ‘[object Object]’;
最终结果就是 ‘’ + ‘[object Object]’ == ‘[object Object]’。
{}+[]
这题 {} 在这个位置不是对象,而是表示块,不用理会(如要有表示对象,应该用 ()
进行包裹,({})
)。
所以可以看成 +[],那么加号是运算符号的 +。
那么 [] 要转为 number,[].valueOf() 肯定是 [] 非原始值,只看 [].toString() 为空串。空串用 Number 进行包装,Number('') == 0
最终结果就是 +0 == 0。
!+[]+[]+![]
首先 !+[]
最终会转为 boolean,这个加号是运算加。!+Number([]),!+0,!Boolean(0), !false,true;
然后 true+[]
,这个加号是字符串连接,true + ‘’,’true’;'true'+![]
,这个加号也是字符串连接,’true’+String(![]),![],是先转为 boolean,Boolean([]) 为 true, !true 就是 false。即 ![] 为 false。
‘true’+false,最终结果就把两边转为字符串再连接,’truefalse’。
[] == ![]
== 是把两边最终都转为 number 作比较,Number([])
,0![]
,因为有 ! 要先转为 boolean,下一步才转 number
- ![] 为 !Boolean([]), Boolean()中非虚值都为 true,所以是 !true, 即 false
- 再把 false 转为 Number(false),即 0
最终比较 0 == 0,结果是 true
{} == !{}
== 是把两边最终都转为 number 作比较Number({})
{}.toString() 为 ‘[object Object]’,然后 Number(‘[object Object]’),为 NaN!{}
, 因为有 ! 要先转为 boolean,下一步才转 number
- !{} 为 !Boolean({}),Boolean()中非虚值都为 true,所以是 !true, 即 false
- 再把 false 转为 Number(false),即 0
最终比较 NaN == 0,结果是 false