== 和 === 的区别
- "==" ,先隐式类型转换,再判断值是否相等
- "===",直接判断 类型 + 值 是否相等
console.log(1 == "1"); // true,因为在比较之前,字符串"1"会被转换为数值1
console.log(true == 1); // true,因为在比较之前,布尔值true会被转换为数值1
console.log(1 === "1"); // false,因为它们的类型不同
console.log(true === 1); // false,因为它们的类型不同
问题补充:当 a = ? 以下代码成立?
if (a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
const a = {
i: 1,
valueOf: function () {
return this.i++;
}
}
if (a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
这是一个经典的 JavaScript 面试题,利用对象的 valueOf
方法。
在这个例子中,a
是一个包含 valueOf
方法的对象。valueOf
方法在对象参与运算时会被调用。在这里,当 a
参与相等比较时,会调用 valueOf
方法。valueOf
方法返回 this.i++
,即返回当前 i
的值,并将 i
自增。
因此,表达式 a == 1 && a == 2 && a == 3
可以理解为:
- 第一次比较:
a == 1
,调用valueOf
方法返回1
,比较成功。 - 第二次比较:
a == 2
,调用valueOf
方法返回2
,比较成功。 - 第三次比较:
a == 3
,调用valueOf
方法返回3
,比较成功。
因此,最终条件为真,console.log('Hello World!');
会被执行。
这是通过修改对象的 valueOf
方法,使其在每次比较时返回不同的值,从而实现了一个看似不合常规的相等比较。这种做法并不推荐在实际开发中使用,因为不容易理解,可读性差,容易引起代码维护的困扰。