==equality(等同):两边值类型不同的时候要先进行类型转换再比较;
===identity(恒等):不做类型转换,类型不同一定不等;
具体说明:
下面的规则用来判断两个值是否===(恒等):
- 如果类型不同,则不相等;
- 如果两个值都是数值类型,并且是同一个值,那么相等;如果其中至少一个是NaN,则不相等(用isNaN()来判断一个值是否是NaN);
- 如果两个都是字符串,每个位置的字符都一样,则相等;否则不相等;
- 如果两个值都是true,或者都是false,则相等;
- 如果两个值都引用同一个对象或函数,则相等;否则不等;
- 如果两个值都是null,或者都是undefined,则相等;
下面的规则用来判断两个值是否==(等同):
- 如果两个值类型相同,进行 === 比较;
- 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
- 如果一个是null,一个是undefined,则相等;
- 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较;
- 如果任一值是true,把它变成1再比较;如果任一值是false,把它变成0再比较;
- 如果一个是对象,另一个是数值或字符串,把对象转换成基本类型的值再比较。对象转换成基本类型,利用它的tostring()或者valueof()。JS内置类,会尝试先调用valueOf()再调用toString; 除了Date类型,Date利用的是toString 转换;
- 任何其他组合都不相等;
举例:
person 是一个对象, person 是一个string:
var person = function(){name:"eric"}
console.log("object: "+person);
var personstr = 'function (){name:"eric"}';
console.log("string: "+personstr);
console.log(" == compare result: "+(person == personstr));
console.log(" === compare result: "+(person === personstr));
结果:
- 一个是1,另一个是true: a =1 , b = true:
var a = 1;
var b = true;
console.log(" == compare result: "+(a == b));
console.log(" === compare result: "+(a===b));
结果:
- 一个是null, 另一个是undefined: a = null, b = undefined
var a = null;
var b = undefined;
console.log(" == compare result: "+(a == b));
console.log(" === compare result: "+(a===b));
结果:
- 一个是字符串,一个是数值: a = “123”, b = 123
var a = "123";
var b = 123;
console.log(" == compare number result: "+(a == b));
console.log(" === compare number result: "+(a===b));
结果: