思考一下 [] == ![] 的结果

考点

看到这个题的第一眼,我想都没写直接就是false,不就是一个取反吗,还比较啥…OK,这个时候已经掉到坑里去了,我太小瞧它了!

这道题有两个点:

  • 运算符优先级
  • 强制类型转换

分析

下面我们看看分析:
首先,!的优先级大于==,所以会先计算![],而[]其实是一个引用类型,这里又涉及到了对引用类型转化为布尔值。[]转化为布尔值为true
在这里插入图片描述
然后取反后为false,目前为止右边已经变成了布尔值false,但是现在该怎么比较呢,左边是引用类型,右边是布尔值。那么这个时候JS会进行强制转换,首先右边的false转化为数字类型为0,同样左边的引用类型转化为数字类型也为0,如此一比较,最后的答案就是true了。但是如果是===,那肯定是false,因为不会发生这个强制转换。

其实强制转化的时候都调用了Number这个构造函数(也叫基本类型包装对象),看下图:
在这里插入图片描述

总结

  1. 判断优先级 !优先于==
  2. 引用类型转化布尔类型 Boolean([])true(Boolean()默认为false),!取反后为true
  3. 左右两边强制转化为数字类型 Number([])0(数组),右边的Number(false)也为0
  4. 上面的问题已经变为了 0 == 0 完事!

延伸

这道题延伸出来的知识当然不止这些,我们可以举一反三,比如:

  • 基本类型和引用类型(ES6多了个SymbolES10多了个BigInt,这玩意目前处于草案的第三阶段,不过也快了,可参考MDN
  • 判断类型(typeofinstanceofObject.prototype.toString.call() )
  • 手动实现instanceof
  • 类型的隐式转化和强制转化
  • 什么是基本包装类型(JS高程P118,你将彻底弄懂这是个啥)
  • 基本类型的值和引用类型的值在哪存储(堆和栈)
  • 浅拷贝和深拷贝? || 垃圾回收机制 ?

这里就不给答案啦,大家可以按着这个思路来自己思考。

最后,推荐一篇很好的文章,你会有更好的理解,咱只是借助面试为切入点,来深入挖掘,而不是一个搬运工!=======>>>>>>深入理解JS的类型、值、类型转换

上面那篇文章写得可好了,比我的好多了,当然也可以支持下我的文章,点点赞啥的也万分感谢啦!(嘻嘻嘻)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值