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);
复制代码