JavaScript如何实现 a == 1 && a == 2 && a == 3?

今天来看一道面试题,题目如下:如何使 a == 1 && a == 2 && a == 3成立。

分析:

比较两个值是否相等有两种,一个是 “==”,一个是“===”,而这里使用的是 “==”

===:绝对相等,左右两边值和类型都相等。(如 1 === '1' 是不成立的)

== :相等,左右两边类型不同,会默认先转换为相同的类型,再去作比较。

  • 对象 == 字符串:对象转字符串
  • null == undefined:相等,但和其他值都不相等
  • NaN == NaNNaN与任何值都不相等(包括自己)
  • 剩下的都是转化为数字
  • 对象转化为数字或字符串:
    • 先调用 Symbol.toPrimitive 这个属性
    • 没有这个属性,再去调用valueOf这个属性去获取原始值(基本类型值)
    • 没有原始值,再去调用toString变为字符串
    • 如果最后是转换为数字,再去调用Number,把字符串转换为数字

1、通过数据类型转换的方式

var a  = {
    i: 0
}
a[Symbol.toPrimitive] = function () {
    return ++this.i;
}
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}

2、通过数据劫持的方式

在全局上下文中基于var/function声明变量,相当于给window设置对应的属性window.aObject.definePrototype借此对象中的某个属性的获取和设置等操作。

var i = 0;
Object.defineProperty(window, 'a', {
    get () {
        // 获取window.a的时候触发getter函数
        return ++i;
    },
    set (value) {
        // 设置window.a属性值的时候触发setter函数
    }
})
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}

你可能感兴趣的:(JavaScript如何实现 a == 1 && a == 2 && a == 3?)