1. Javascript除了有==和!=两个运算符比较两个值或对象是否相等,还提供了===和!==两个运算符。
2. ==和!=在比较两个值或者对象是否相等时,有可能将被比较的值或者对象转换之后再做比较。
2.1 布尔值将会转换成数值。true被转换成1,false被转换成0。
console.log(false == 0); // true
console.log(true == 1); // true
console.log(true == 3); // false
2.2 如果==或!=的一端是number类型,另一端是string类型,string类型会先转换成number类型再比较时候相等。
console.log("3" == 3); // true
2.3 如果==或!=是引用类型的一个对象而另一端不是,将用valueOf()方法取得应用类型对象的值再作比较。
var a = "hello world";
var b = new String("hello world");
console.log(a == b); // true
在上述代码中,a是一个string而b是一个object,但由于b的内容和a一样(b.valueOf()返回值为hello world的string),因此a == b比较的结果仍然是true。
2.4 null和undefined相等。
console.log(null == undefined); // true
2.5 null和undefined不能转换成其他类型,因此null或defined与其他值或对象相比较均不相等
console.log(null == 0); // false
console.log(undefined == 0); // false
console.log(null == ''); // false
2.6 NaN不和任何值或对象相等。NaN甚至不等于NaN。
console.log(NaN == 0); // false
console.log(NaN == 'NaN'); // false
console.log(NaN == NaN); // false
2.7 如果比较两个应用类型的对象,如果它们是同一对象则相等,否则不相等。
var a = [1, 2, 3];
var b = [1, 2, 3];
console.log(a == b) // false
在上述代码中,a和b都是Array类型的对象,并且数组中的内容是一样的。但由于它们指向的不同对象,因此仍然被认为是不相等的。
3. 如果用===和!==比较两个对象或者值是否相等,则只有当它们的类型和值都相等时,才被认为是相等的。也就是说,当用===或!==比较时,不会发生类型转换。如果类型不同,则认为是不相等的。
console.log(false === 0); // false
console.log(true === 1); // false
console.log("3" === 3); // false
var a = "hello world";
var b = new String("hello world");
console.log(a === b); // false
console.log(null === undefined); // false
在上面的代码中,在用===比较时由于两个被比较的元素是不同的类型,因此所有比较的结果均为false。但如果用运算符==进行比较, 所有结果均为true。