最近在准备面试,复习过程中想起之前字节面试的一道非常有意思,并且知识点比较全面细节的一道题,面试官当时问的是 [] == !([]) 应该返回什么,被问的有点傻,后面面试官提示了自己下面又看了以后理解,把这个有趣的题给大家分享一下。
首先说一下 ==和===
==:
相等操作符会对操作值进行隐式转换后进行比较
1、布尔值、字符串和数值进行比较,转换为数值之后在进行比较
2、null与undefined是相等的
3、与NaN判等,返回false
===:
全等操作符不会进行隐式转换,而是直接比较
(1)如果类型不同,就一定不相等
(2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
(3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
(4)如果两个值都是true,或是false,那么相等
(5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等
(6)如果两个值都是null,或是undefined,那么相等
TIPS: == 和 === 区别
1、对于Array,Object等高级类型,两者无区别:进行“地址”比较(这涉及到基本数据类型和引用数据类型的区别,之后的文章我也会继续讲解)
2、对于基础类型==判断值是否相等,===不仅判断值,而且判断类型是否相等。
3、基础类型与高级类型有区别:==将高级类型转化为基础类型,进行“值”比较,===直接返回false
1、Boolean([]) //true 空数组转换为布尔值是true
2、优先级问题: !运算符的优先级 高于==运算符(这类题需要格外注意运算符的优先级)
3、==运算符会进行隐式转换数值(也就是在比较前会把==两边的值转换成number)
所以,整个等式比较的流程就是:
1.先是转换位布尔值,Boolean(![]) = false;
2.等式变为 [] == false;
3.然后再转换为数值, Number([]) == Number(false)
4.最终得到 0 == 0,return true
然后再给大家讲一下,[] == []的问题
由于Array,Func,Object都属于引用数据类型,其在栈内存中存储的仅为其堆内存中内容的地址指针,当遇到相同引用数据类型相等判断的时候,由于其根本上是两个不同堆内存在栈内存上的映射,所以会返回false,可以理解为没有相同的两个Object,只要记住这个就好。
这个题还是很有趣的,考察了 ==和===的区别,运算符的优先级问题,基本数据类型和引用数据类型的区别以及隐式转换的问题,属于是非常有价值的题目,大家可以好好参透理解,之后也会继续给大家分享我的前端面经~