前言

不多说,这一篇全是题目和解析,直接上题目了,如果不懂得可以看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

这里很多人肯定会懵,这怎么就有长度了?提示一下:有!取反运算符哦

好了,这里还涉及了运算符优先级

javascript类型转换(下篇)
可以从表中看到,!优先级高于+,所以执行顺序会变成(!( + [] ) + [] + ![])

因此先看第一个!(+[]),此时先执行()内部的+[],之前也说了,一元运算符+会对值进行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

总结

这些题目,我都是跟做数学题一样,套上篇的公式(也就是规范)做的,那么是不是把这个规范记熟,按照规范一步步执行,是不是就能跨越这种类型转换的坑呢?

也希望这些题目的解题过程,结合上一篇,能让大家收获颇丰!

也求波点赞,关注!

javascript类型转换(下篇)

相关文章:

  • 2022-02-10
  • 2021-07-15
猜你喜欢
  • 2021-04-24
  • 2021-12-24
  • 2021-12-23
  • 2021-11-05
  • 2021-04-13
  • 2021-08-02
相关资源
相似解决方案