JavaScript中“==”比较规则

1、(js中有6个值为false,分别是: 0, ''(或者双引号), null, undefined,NAN,false)
console.log(new Boolean(false)==false);   //true
console.log(new Boolean(true)==true);   //true
 // 另外,js中有Boolean对象,例如:通过newBoolean(false)能获得一个初始值为false的布尔对象,既然是对象,我们 获得的就永远是true,所以if(new  Boolean(false)){//这里面的代码一定会执行,即使布尔对象的值是false}.再次强调,用Boolean()或两次取非来获取布尔值.
复制代码
2、undefined 和 null 互相比较返回true, 和自身比较也返回true, 其他情况返回false;
3、Infinity只和自身比较返回true;
4、NaN,{},[]和任意值比较都是返回false;
5、如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较
6、要比较相等性之前,不能将null和undefined转换成其他任何值
7、 如果一个值是数字,另一个是字符串,先将字符串转换为数值,然后使用转换后的值进行比较
8、 如果一个值是对象,另一个值是数字或字符串,将会先使用toString()和valueOf()将对象转换为原始值,然后再进行比较

(这种比较与是有规则的,并且可以用代码来验证JS内部的执行情况,将一个简单类型(这里指除undefined与null的值)与一个对象比较时,先调用对象的valueOf方法,以期待返回一个标量,如果对象的valueOf方法返回的仍然是一个复合对象的话,就接着调用对象的toString方法以期待返回一个标量,如果仍然没有返回标量的话,就判为不相等,如果valueOf或toString方法之一返回一个标量,就用这个标量同==另一边的标量进行比较 )

var obj={};  
alert(obj=="abc");//false  
obj.toString=function () {  
    return 'abc';  
};  
alert(obj=='abc');//这时就返回true了  
  
alert(obj==123);//false  
obj.valueOf=function () {return 123};  
alert(obj==123);//true!!!  
  
obj.valueOf=undefined;//先将这个方法清空掉,以免受上面的代码影响  
alert(obj==true);//false  
obj.valueOf=function () {  
  return 1;//只要返回一个能转换成布尔值的标量就行了,1或true都行,都表示true  
};  
alert(obj==true);//true!!!!  
复制代码
9、 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false

ECMAScript规范:

1:a与b进行比较,如果a与b是Number,String,Boolean这三种类型中的一种,并且a与b的类型不同,那么就将a与b都转换成数字再进行比较
var a="true";  
var b=true;  
alert(a==b);  
//结果等同于下面的代码  
alert(Number(a)===Number(b)); 
复制代码
2:如果a是Number,String,Boolean这三种类型中的一种,而b是一个复合对象时(Object,Array等) 则对b执行ToPrimitive操作(这步是JS解释器执行的,ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值,如果这两个方法没有返回基本值 ,那就认定不相等 )
var a="abc";  
var b={};  
alert(a==b);  
//上面的一行代码在JS解析时将被解释成  
//a==ToPrimitive(b);  
复制代码

总结 :

Number,Boolean,String,Undefined这几种基本类型混合比较时,会将其转换成数字再进行比较 基本类型与复合对象进行比较时,会先将复合对象转换成基本类型(依次调用valueOf与toString方法)再进行比较 undefined被当成基本类型,undefined转换成数字是NaN,因此undefined与除null之外的其它类型值进行比较时始终返回false(注意NaN==NaN返回false) null被当成复合对象,由于null没有valueOf与toString方法,因此和除了undefined之外的其它类型值进行比较时始终返回false
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值