第64天 如何让(a==1 && a==2 && a==3)的值为true,把"=="换成"==="后还能为true吗?
好像是利用 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
Most helpful comment