Skip to content

比较运算符

相等运算符

相等运算符用来比较相同类型的数据时,与严格相等运算符完全一样

js
1 == 1.0;
// 等同于
1 === 1.0;

比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较

(1)原始类型值

原始类型的值会转换成数值再进行比较

js
1 == true; // true
// 等同于 1 === Number(true)

0 == false; // true
// 等同于 0 === Number(false)

"true" == true; // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1

"" == 0; // true
// 等同于 Number('') === 0
// 等同于 0 === 0

"" == false; // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0

"1" == true; // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1

(2)对象与原始类型值比较

对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较

具体来说,先调用对象的 valueOf() 方法,如果得到原始类型的值,就按照上一小节的规则,互相比较;如果得到的还是对象,则再调用 toString() 方法,得到字符串形式,再进行比较

js
// 数组与数值的比较
[1] == 1; // true

// 数组与字符串的比较
[1] == "1"; // true
[1, 2] == "1,2"; // true

// 对象与布尔值的比较
[1] == true; // true
[2] == true; // false

下面是一个更直接的例子

js
const obj = {
  valueOf: function () {
    console.log("执行 valueOf()");
    return obj;
  },
  toString: function () {
    console.log("执行 toString()");
    return "foo";
  },
};

obj == "foo";
// 执行 valueOf()
// 执行 toString()
// true

(3)undefined 和 null

undefinednull 只有与自身比较,或者互相比较时,才会返回 true;与其他类型的值比较时,结果都为 false

js
undefined == undefined; // true
null == null; // true
undefined == null; // true

false == null; // false
false == undefined; // false

0 == null; // false
0 == undefined; // false