前言
不多说,这一篇全是题目和解析,直接上题目了,如果不懂得可以看javascript类型转换(上篇)
[]+[]
首先这两个都是对象类型,所以会执行toPrimitive内部方法,而[[DefaultValue]]的hint值为空,hint值为空相当于hint为number的时候。
所以会先执行valueOf,然后根据返回值判断是否执行toString。
那么来看看这里的第一个[],执行valueOf后,因为数组的valueOf会返回数组本身,因此这个返回值还不是基本类型值,因此会执行toString,所以[]这时候变成了"“空字符串,而后面的[]同理,所以[]+[]为”" +""
而"" + “” 涉及到二元+,但是这里没必要分析(后面分析了),直接拼接即可
答案为::""
[]+{}
首先这两个都是对象类型,所以会执行toPrimitive内部方法,而[[DefaultValue]]的hint值为空,hint值为空相当于hint为number的时候。
所以会先执行valueOf,然后根据返回值判断是否执行toString。
所以第一个[]执行valueOf后,因为数组的valueOf会返回数组本身,因此这个返回值还不是基本类型值,因此会执行toString,所以[]这时候变成了""空字符串
然后第二个{}执行valueOf后,因为对象的valueOf会返回对象本身,因此这个返回值还不是基本类型值,因此会执行toString,而对象的toString会变成[object Object]
然后""+[object Object]
答案为: "[object Object]"
{} + []
按照之前的套路来说,应该是将两个对象类型都执行toPrimitive,然后进行+运算符
但是这里有个坑,也就是js引擎会将{}这个解析为代码块,因此会变成{};+[]
所以此时只会执行 +[] ,而一元运算符+会对值进行toNumber操作,因此[]的toNumber为0
答案为:0
({} + [])
这里就是填上面的坑了,在括号内,{}并不会被解析为代码块
所以对两者进行toPrimitive,{}执行完后为[objcet Object]
[]执行完后为""
[objcet Object] + “”
答案为:"[object Object]"
true + true + true === 3
这是二元+运算符,会对左右两只进行hint值为default的toPrimitive调用,因此true先执行valueOf,因为是Boolean类型,所以返回的是true本身,而此时已经是基本类型值了,直接返回true这个值
这时进行完toPrimitive调用后,判断两边值是否有string类型,此时两边的值都是true,为Boolean类型
所以对两值进行 加法运算, 这时true会执行toNumber,true变为1,因此1+1+1 === 3
答案为: true
(! + [] + [] + ![]).length
这里很多人肯定会懵,这怎么就有长度了?提示一下:有!取反运算符哦
好了,这里还涉及了运算符优先级
可以从表中看到,!优先级高于+,所以执行顺序会变成(!( + [] ) + [] + ![])
因此先看第一个!(+[]),此时先执行()内部的+[],之前也说了,一元运算符+会对值进行toNumber,而[]的toNumber为0
所以现在为!0,而取反运算符,会对值进行toBoolean操作,0的toBoolean为false,然后判断false是否为true,如果不为true,返回true
所以现在第一个表达式算出来后为true
接着看第二个!的执行,![],[]进行toBoolean操作,转为true,再进行!true,所以此时为false
所以现在成了 true + [] + false
而此时又是二元+运算符了,对两边的值进行toPrimitive,先分析true + [],true返回true,而[]执行valueOf后返回本身,所以又执行toString后,[]的toString为"“空字符串,所以执行完toPrimitive后,两边值为true和”",接着判断两边值是否有string类型,确实有一个string类型,那么进行拼接操作,因此true+[]的结果为"true"
接着进行"true" + false, 同上面一样,进行完toPrimitive后,判断string类型,恰好"true"为string类型,进行拼接操作,所以变成了"truefalse".length
答案为::9
true == ‘true’
这个,就很好玩了,大多数人都会以为这题目是true,其实很坑
首先这是判等,那么找出两边值类型套公式(上篇给出了表格)就行了,左边值为Boolean类型,右边为String类型,那么==返回的是toNumber(true) == toNumber(‘true’)的结果
true这个Boolean执行toNumber,转为1,没什么好说的
'true’这个String执行toNumber,转为NaN,这也是很常见的
此时 1 == NaN 这个判断
答案为:false
总结
这些题目,我都是跟做数学题一样,套上篇的公式(也就是规范)做的,那么是不是把这个规范记熟,按照规范一步步执行,是不是就能跨越这种类型转换的坑呢?
也希望这些题目的解题过程,结合上一篇,能让大家收获颇丰!
也求波点赞,关注!