找回密码
 立即注册

QQ登录

只需一步,快速开始

@Martin.Zhang
中级会员   /  发表于:2022-11-14 12:12  /   查看:2302  /  回复:2
本帖最后由 James.Lv 于 2023-1-5 17:36 编辑

image.png127344969.png

这个问题对于很多没有系统学过前端开发的技术人员来说,算个重点,来画起来,我们一起看。
请看题,以下执行结果是啥?
  1. console.log([]==![]);
复制代码
是不是很神奇
那么为什么会出现这种情况,我们从==与===的特性说起
我们先来分析一下上面的等式:
1.左边是一个数组,右边是一个表达式,左边数组就是:[]  , 右边是一个数组的取反 ![] ,所以算是一个表达式,后面取反后得到 false,
image.png452460631.png
所以这里可以将等式替换为,相当于 []==false 的比较,
  1. console.log([]==false);
复制代码
这里,还是有点不符合逻辑,我们再继续拆分
分析:因为这里用的是双等号,左边是数组,右边是值,所以根据双等号的特性,需要将两边都转换为原始类型,用ToString来转换,所以这里执行后显示为:
image.png482975158.png
我们继续替换等式
  1. console.log(''==false);
复制代码
执行后结果为:true,是不是有点抓狂的感觉。
现在两边都为原始类型,但是类型还是不一样,左边是字符串,右边是bool 类型 ,所以这个 == 又要去干件大事了,继续转,将两边都转换为数值类型 。
那么继续转:
image.png225686339.png
然后最终执行的表达式就是:
  1. console.log(0==0);
复制代码
执行结果为:true;

所以表达式中如果需要比较,尽量使用===,因为==在执行中非常诡异,给大家再举个例子:
  1. console.log(true==[1]);
复制代码


是不是神奇的知识又增加了!

2 个回复

倒序浏览
nimotea
超级版主   /  发表于:2022-11-15 10:31:18
推荐
QQ图片20221115102916.jpg
回复 使用道具 举报
@Martin.Zhang
中级会员   /  发表于:2022-11-15 10:38:26
板凳

优秀,js是唯一能逼疯程序员的语言
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部