Fe-interview: [js] 第64天 如何让(a==1 && a==2 && a==3)的值为true,把"=="换成"==="后还能为true吗?

Created on 18 Jun 2019  ·  22Comments  ·  Source: haizlin/fe-interview

第64天 如何让(a==1 && a==2 && a==3)的值为true,把"=="换成"==="后还能为true吗?

js

Most helpful comment

var val = 0;

Object.defineProperty(global, 'a', {
  get: function(){
    return ++val;
  }
})

All 22 comments

好像是利用 valueOf() toString() ==的类型转换实现, 换成 === 不能为true

@xn213 如果为"=="时,那a的值为多少呢?换成"==="后不能为true了吗?你的理由是什么呢?

@xn213 如果为"=="时,那a的值为多少呢?换成"==="后不能为true了吗?你的理由是什么呢?

==可以进行类型转换, 才可能等1等2等3 , === 即先比较类型再比较值, 类型不同直接返回false, 理解这样,

或许 nothingIsImpossible,,,,,

@xn213 如果为"=="时,那a的值为多少呢?换成"==="后不能为true了吗?你的理由是什么呢?

==可以进行类型转换, 才可能等1等2等3 , === 即先比较类型再比较值, 类型不同直接返回false, 理解这样,

或许 nothingIsImpossible,,,,,

但我认为是可以做得到的,期待……

(a++==1 && a++==2 && a++==3)

var val = 0;

Object.defineProperty(global, 'a', {
  get: function(){
    return ++val;
  }
})

期待这个答案

let a = {
    value: 0,
    valueOf() {
        return ++this.value;
    }
}
a == 1 && a == 2 && a == 3 // true
let a = {
  value: 0,
  valueOf() {
      return ++this.value;
  }
}
a == 1 && a == 2 && a == 3 // true

改为全等的时候呢?

const a = { value : 0 };
a.valueOf = function() {
    return this.value += 1;
};

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

简单来说就是==会触发valueOf()方法
参考:https://juejin.im/post/5bfcc632f265da61493353cc

还可以利用 Array 与数字判断时会转字符串再转数字的规律,改写 join 方法。

var a = [1, 2, 3];
a.join = function() { return this.shift() };
console.log(a == 1 && a == 2 && a == 3); // true

https://github.com/haizlin/fe-interview/issues/295#issuecomment-503490331

那参考这篇文章分析的应该足够了

=== 严格相等,会比较两个值的类型和值
== 抽象相等,比较时,会先进行类型转换,然后再比较值

"==" 转化规则:
首先通过valueOf 转换,即 obj.valueOf()方法的返回值
如果 obj.valueOf()方法的返回值是原始类型,那么直接返回
如果不是,再通过 obj.toString()方法转换
如果obj.toString()返回的是原始类型,直接返回该值
如果还不是原始类型,抛出不能转换异常。

var a=[1,2,3];
a.join=a.shift;

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

let val = 0;
Reflect.defineProperty(window, 'a', {
  get: () => ++val,
});
(a===1 && a===2 && a===3)

let a
!(a==1 && a==2 && a==3)

let a
!(a==1 && a==2 && a==3)

你可真是个天才

let a
!(a==1 && a==2 && a==3)

这个答案太秀了

let a
!(a==1 && a==2 && a==3)

独秀同学请坐

还是没有懂……

利用Object.defineProperty添加get描述符就可以了吧.

"use strict;";
var arr = [1, 2, 3];
Object.defineProperty(globalThis, "a", {
  get: function () {
    return arr.shift();
  },
});
console.log("结果:", a === 1 && a === 2 && a === 3);

let a = {
  value: 0,
  valueOf() {
      return ++this.value;
  }
}
a == 1 && a == 2 && a == 3 // true
Was this page helpful?
0 / 5 - 0 ratings