你有仔细了解(相等)==和(全等)===的区别么?

开胃菜

废话少说,我们直接从题目入手,判断true或者false

1
2
3
4
5
6

//判断下面的对错
6==6;
6===6;
6=="6";
6==="6";

那么,答案是多少呢?放入浏览器,我们很容易知道答案:

1
2
3
4
5
6
7
8
6==6;
true
6===6;
true
6=="6";
true
6==="6";
false

我们知道,==会先检查两个操作数的数据类型是否相同,如果相同,则比较两个数是否相等,如果不同,则先将两个数转换为相同数据类型,再进行比较。

那么,6==66===6就不用说了,肯定为true,而6=="6",则是会把字符类型的6转换为数字类型的6,再同时比较,所以,为true。由此,因为全等是包含数据类型也要相等的,所以6==="6"false

简单嘛?我们现在开始来看一点不一样的** (^_^)

1
2
3
4
5
6
7
true == 1;

false == 0;

true === 1;

false === 0;

好,我们来揭晓答案。

1
2
3
4
5
6
7
8
true ==1;
true
false == 0;
true
true ===1;
false
false === 0;
false

在JavaScript中,常常会把1表示true,也就是0表示false,及没有,不存在。在全等中,0是数字类型,false为布尔类型,类型都不相等,所以为false咯。

简单吧?下个走起~** (^_^)

同理,判断一下结果:

1
2
3
4
5
''==0;
' '==0; //这里面是有空格的
null == undefined;
null == 0;
undefined == '';

好,揭晓答案:

1.在''==0中,我么知道,0表示无,没有,所以,这里会0会转换成字符串类型是为空,即没有,所以为true

2.在' '==0;中,同理,单引号里的空格也是没有,所以转换之后为0,及true

3.null在JavaScript中表示空值,也就是说,当前不应该有对应的值,希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态 。undefined的字面意思就是未定义的值的变量,或者为声明的变量,这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果。既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性。所以,在ECMScript中认为null == undefined 为 true

4.根据3,null在比较的时候不会转换任何类型,为false;

5.根据3,undefined与4同理,为false

还行吧?下个走起~ (^_^)

1
2
3
4
'false'== false;
NaN == NaN;
NaN == false;
NaN === false;

相信很多同学在第一题中肯定会回答为true ,理由是因为==可以类型转换比较。在JavaScript中,布尔值会转成数字类型,true转成1,false转成0。数字和字符串比较,字符串会转换成数字。所以,这俩都不相同,正解为false

NaN 是一个特殊值,它是属于数字类型的。NaN一般说明某些算术运算(如求负数的平方根)的结果不是数字(Not a Number)。所以,我们可以理解为它只表是某一种状态的范围值,并不能确切到具体。因此,自身就无法相等了,故NaN==NaN false

同理,NaN == falseNaN === false都为false咯。不能和自身相等了。

好了,重点来啦!

我们先来看看下面的题:

1
2
3
4
5
6
var a={},b={};
var c=a;
a==b;
a===b;
a==c;
a===c;

这里创建了两个对象,如果两个操作数都指向同一个对象,这样会返回为true , a,b都创建了一个空对象,对于引用对象的比较,比的是其地址的值,而不是其真实的值。

image-20211220151530152

故,a==ba===bfalse 。然而,这里把a赋值给c,也就是c指向的堆内存指针也会指向a的,故值,对象地址都会相等,a==ca===ctrue啦!