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

在网上查到一道相似的题目
问:!+[]+[]为何结果为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类型相加得出结果。

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

相应的++[[]][+[]]+[+[]]计算过程为:
计算右边部分:
[+[]],+[]先调用valueOf看能不能得到原始类型,结果还是数组,再调用toString看能不能得到原始类型,结果是字符串,
就是[+“”],即[+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
这篇博文解释了[ ]+[ ],[ ]+{},{}+[ ],{}+{}四个情况输出什么
{}+[ ],特殊情况,{}在程序中代表代码段,最后运行的是+[ ]
({}+[ ])和[ ]+{}输出相同
——————————————————
后来又遇到了一道很NB的题目
([][[]] + [])[+!![]] +([]+{})[+!![]+ +!![]]
([][[]] + [])[+!![]]左边为 ([][[]] + [])[1],转换为([][‘’] +‘0’)[1],转换为(undefined+‘’)[1],转换为(‘undefined’)[1],即n
([]+{})[+!![]+ +!![]]右边为(‘’+‘[object Object]’)[2],即b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值