日期:2014-05-16  浏览次数:20403 次

js === 和 == 的区别

 如果是基本类型
var a=5;
var b=5;
a===b 的结果是true 
a==b  的结果是true  

var a=”qq”;
var b=”qq”;
a===b 和 a==b 的结果相同

true  === true  和 true ==true 的结果相同
false === false 和 false == false 的结果相同


下面是对象类型的比较
var xiaoming = {name:'xiaoming', age:15};
var xiaoming2 = {name:'xiaoming', age:15};
xiaoming == xiaoming2 的结果是false ,值是一样的,为什么比较的时候是false呢? 因为xiaoming存的是一个对象的地址,xiaoming2存的也是对象的地址,它们两个地址空间一定不同,这是比较地址空间,所以为false
xiaoming === xiaoming2  结果是false   ===本来就是比较地址 

var xiaoming = {name:'xiaoming', age:15};
var xiaoming2 =xiaoming;
xiaoming == xiaoming2  为true; 两个变量引有一个地址
xiaoming === xiaoming2 为true; 两个变量引有一个地址

总结:基本类型都是值的比较所以没有区别,引有类型都是地址的比较所以没有区别。

 
现在我们看下它们的不同
 如果是基本类型
“5” === 5   结果是false  为什么呢?因为类型不同,说明不是一个地址
“5”==5  结果是 true  为什么呢? 因为 “5”在比较前会ValueOf()为Number型,他们两个值是相等的,所以为true

null === undefined 结果为false 为什么呢? 因为类型不同,说明不是一个地址
nul == undefined 结果为true  为什么呢?他们两个值是相等的

“1” === true 结果是false, 一定是false没有疑问
“1” == true 结果为true 为什么呢?"1"为ValueOf()为1,true的值也为转化为1 ,所以值相等

var xiaoming = {name:'xiaoming', age:15};
var age = 15;
xiaoming.age == age; 结果是true 值比较
xiaoming.age === age;结果为true 地址比较 //我们以前对象的属性和变量是没有区别的,这里其实还是基本类型比较基本类型

总结:值比较用尽量用==     地址比较用尽量用=== 
 
题外话: NaN == NaN 为false NaN === NaN为false ,为什么有这种情况呢? NaN的意思是not a Number 不是一个数,所以不能比较
 如果要判断一个变量是不是一个数用isNaN()函数
var a= 5;
isNaN(a); //这里应该是false,因为a是一个数,不是数的时候才是true