考点
看到这个题的第一眼,我想都没写直接就是false
,不就是一个取反吗,还比较啥…OK,这个时候已经掉到坑里去了,我太小瞧它了!
这道题有两个点:
- 运算符优先级
- 强制类型转换
分析
下面我们看看分析:
首先,!
的优先级大于==
,所以会先计算![]
,而[]
其实是一个引用类型,这里又涉及到了对引用类型转化为布尔值。[]
转化为布尔值为true
然后取反后为false
,目前为止右边已经变成了布尔值false
,但是现在该怎么比较呢,左边是引用类型,右边是布尔值。那么这个时候JS会进行强制转换,首先右边的false
转化为数字类型为0
,同样左边的引用类型转化为数字类型也为0
,如此一比较,最后的答案就是true
了。但是如果是===
,那肯定是false,因为不会发生这个强制转换。
其实强制转化的时候都调用了Number
这个构造函数(也叫基本类型包装对象),看下图:
总结
- 判断优先级
!
优先于==
- 引用类型转化布尔类型
Boolean([])
为true
(Boolean()默认为false),!
取反后为true
- 左右两边强制转化为数字类型
Number([])
为0
(数组),右边的Number(false)
也为0
- 上面的问题已经变为了
0 == 0
完事!
延伸
这道题延伸出来的知识当然不止这些,我们可以举一反三,比如:
- 基本类型和引用类型(ES6多了个
Symbol
ES10多了个BigInt
,这玩意目前处于草案的第三阶段,不过也快了,可参考MDN) - 判断类型(
typeof
或instanceof
或Object.prototype.toString.call()
) - 手动实现
instanceof
? - 类型的隐式转化和强制转化
- 什么是基本包装类型(JS高程P118,你将彻底弄懂这是个啥)
- 基本类型的值和引用类型的值在哪存储(堆和栈)
- 浅拷贝和深拷贝? || 垃圾回收机制 ?
这里就不给答案啦,大家可以按着这个思路来自己思考。
最后,推荐一篇很好的文章,你会有更好的理解,咱只是借助面试为切入点,来深入挖掘,而不是一个搬运工!=======>>>>>>深入理解JS的类型、值、类型转换
上面那篇文章写得可好了,比我的好多了,当然也可以支持下我的文章,点点赞啥的也万分感谢啦!(嘻嘻嘻)