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

前言

首先,我们来看个demo

let a = {
   value: 1,
    toString() {
        // console.log("toString")
        return this.value++;
    }
}

看一下输出结果:

console.log(a === 1 && a === 2 && a === 3) // false

console.log(a == 1 && a == 2 && a == 3) // true

结论:通过Object的toString()可以实现 a1 && a2 && a3 而并不能实现 a=1 && a=2 && a=3

然后,加上万能的console

let a = {
   value: 1,
    toString() {
        console.log("toString")
        return this.value++;
    }
}
console.log(a === 1 && a === 2 && a === 3) // false
console.log("--------------------------------------")
console.log(a == 1 && a == 2 && a == 3) // true

输出结果:
a==1&&a==2&&a==3 与 a===1&&a===2&&a===3如何实现?_第1张图片

也就是说使用 == 隐式转换使得Object调用了toString()

举例

使a == 1&&a == 2&&a == 3为true的方法
// 方法一:通过toString()实现
let i1 = {
    i: 1,
    toString() {
        return this.i++;
    }
}
console.log("toString() => ", i1 == 1 && i1 == 2 && i1 == 3) // true

// 方法二:通过valueOf()实现
let i2 = {
    i: 1,
    valueOf() {
        return this.i++;
    }
}
console.log("valueOf() => ", i2 == 1 && i2 == 2 && i2 == 3) // true


// 方法三:Object.defineProperty() 实现
let value = 1;
Object.defineProperty(window, "c", {
    get: function() {
        return value++;
    }
})
console.log("Object.defineProperty() => ", c == 1 && c == 2 && c == 3)

// 方法四:通过Proxy实现
let d = new Proxy({}, {
    value: 1,
    get(target, key) {
        return () => this.value++;
    }
})
console.log("new Proxy() => ", d == 1 && d == 2 && d == 3)

// 方法五:Symbol.toPrimitive实现
let e = {
    value: 1,
    [Symbol.toPrimitive]: () => {
        return e.value++;
    }
}
console.log("Symbol.toPrimitive => ", e == 1 && e == 2 && e == 3)

// 方法六:数组的shift()方法
let f = [1, 2, 3]
f.join = f.shift;
console.log("shift() => ", f == 1 && f == 2 && f == 3)

// 方法七:数组的pop()方法
let g = [3, 2, 1]
f.join = f.pop;
console.log("pop() => ", g == 1 && g == 2 && g == 3)
使a === 1&&a === 2&&a === 3为true的方法
 // 方法1:Object.defineProperty实现
   let value = 1;
   Object.defineProperty(window, "a", {
     get:function() {
       return value++;
     }
   });
    console.log(a === 1 && a === 2 && a === 3) // true
    
    // 方法2:Proxy实现
   let b = {
       number: 1
   };
   b = new Proxy(b, {
       get(target, key) {
           return target[key]++;
       }
   });
   console.log(b.number === 1 && b.number ===2 && b.number ===3) // true

你可能感兴趣的:(javascript,前端,开发语言)