由一题++[[]][+[]]+[+[]],引发关于隐式类型的思考

在网上查到一道相似的题目
问:!+[]+[]为何结果为4?
js是弱类型语言,隐式类型转换频繁
js里隐式转换的规则为:

  1. 如果其中有一个操作数为string,则将另一个操作数隐式的转换为string,然后进行字符串拼接得出结果。
  2. 如果操作数为对象({})或者是数组([])这种复杂的数据类型,那么就将两个操作数都转换为字符串,进行拼接

String([]) //[]进行字符串转换得到结果为""
String({}) //{}进行字符串转换得到结果为"[object Object]"

  1. 如果操作数是像boolean这种的简单数据类型,那么就将操作数转换为number相加得出结果

所以!+[]+[]计算过程为
先计算!+[],把[]转换为了"",相当于计算!+"",结果为!"",!""= true。在计算后边+[],等价于true+[],也就是true+""=‘true’,最后字符串’true’.length = 4
这里可以得出,当boolean这种数据类型和[]数组类型用+连接的时候,是直接把双方转化为了string类型,然后进行了字符串拼接。
而两个boolean类型用+连接的时候,才是都转化为number类型相加得出结果。

——————————————————

相应的++[[]][+[]]+[+[]]计算过程为:
计算右边部分:
[+[]],就是[+""],即[+false],即[+0],即[0]
在这里插入图片描述
为对象类型(准确说是数组)

计算左边部分:
++[[]][+[]],由上可得可转化为++[[]][0]
[[]]就是一个[0: [ ]]这么个东西,所以它的0项就是[ ]
++自增,在包含有效数字的字符串时,先将其转换为数字值,再执行加1
Number([ ])为0,左边部分最终结果是数字类型的1

1+[0],即字符串类型的10
复杂数据类型在隐式转换时会先转成String,然后再转成Number运算
在这里插入图片描述

https://www.cnblogs.com/ziyunfei/archive/2012/09/15/2685885.html
这篇博文解释了[ ]+[ ],[ ]+{},{}+[ ],{}+{}四个情况输出什么

猜你喜欢

转载自blog.csdn.net/s8806479/article/details/114598108