JavaScript中三个等号和两个等号你了解多少中三个等号和两个等号你了解多少
本篇文章主要介绍了js里面的==和===,== 判断如果两边变量的类型不同,而 === 则不做类型转换,有兴趣的
可以了解一下
引子引子
众所周知,用在if条件判断语句中,js有六种假值:false, null, undefined, '', NAN, 0。先来看几个例子:
[] === []
NaN === NaN
NaN == NaN
0 == []
'' == []
'' == {}
[] == undefined
{} == []
null == undefined
以上这些判断结果是什么,大家能否一看就知道结果呢?笔者以前对==和===都只有大概的印象,相信大家也都知道,== 判
断如果两边变量的类型不同,会将其先做类型转换再作判断,而 === 则不做类型转换,如果类型不同,就一定返回 false。但
是笔者最近看到了一个题目,感觉很有意思,贴出来给大家看看:
var x = 1;
var obj = {
valueOf: function(){
x = 2;
return 0
}
}
console.log(obj == 0, x)
恩,这段代码输出的结果是 true, 2,是不是不可思议?还有~
var x = 1;
var obj = {
valueOf: function(){
return {}
},
toString: function(){
return {}
}
}
console.log(obj == 0)
这段代码直接抛出了异常: Uncaught TypeError: Cannot convert object to primitive value。
如果你和我一样觉得很奇怪,那就继续往下看吧~
=== 的规则的规则
这个比较简单,我把规则罗列一下
1. 如果类型不同,就不相等
2. 如果两个都是数值,并且是同一个值,那么相等,例外的是,如果其中至少一个是NaN,那么不相等。(判断一个值是
否是 NaN,只能用isNaN() 来判断)
3. 如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等。
4. 如果两个值都是true,或者都是false,那么相等。
5. 如果两个值都引用同一个对象或函数,那么相等;否则不相等。
6. 如果两个值都是null,或者都是undefined,那么相等。
这里不难发现,复合类型的数据(比如对象、数组、函数等)之间的比较不是比较他们的值是否相等,而是比较他们引用的对
象是否一样,因此也不难明白,为什么 [] === [] 判断为false了。
比如:
== 探究探究
看下 == 的规则
1. 如果两个值类型相同,进行 === 比较。
2. 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
3. 如果一个是null、一个是undefined,那么相等。