Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haizhilin2013 opened this issue Jun 18, 2019 · 25 comments
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

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

@haizhilin2013 haizhilin2013 added the js JavaScript label Jun 18, 2019
@xn213
Copy link

xn213 commented Jun 18, 2019

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

@haizhilin2013
Copy link
Collaborator Author

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

@xn213
Copy link

xn213 commented Jun 18, 2019

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

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

或许 nothingIsImpossible,,,,,

@haizhilin2013
Copy link
Collaborator Author

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

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

或许 nothingIsImpossible,,,,,

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

@WebMrYang
Copy link

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

@jiangli373
Copy link

var val = 0;

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

@WANGSHUZHI
Copy link

期待这个答案

@zhulinghao
Copy link

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

@haizhilin2013
Copy link
Collaborator Author

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

改为全等的时候呢?

@AnsonZnl
Copy link
Contributor

AnsonZnl commented Jun 19, 2019

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

@forever-z-133
Copy link

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

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

@xn213
Copy link

xn213 commented Jun 19, 2019

#295 (comment)

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

@HuaRongSAO
Copy link

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

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

@leehf
Copy link

leehf commented Jul 5, 2019

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

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

@KiraYo4kage
Copy link

KiraYo4kage commented Jul 5, 2019

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

@canvas2000
Copy link

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

@wsgwwdaa
Copy link

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

你可真是个天才

@seho-dev
Copy link

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

这个答案太秀了

@ducky-YFH
Copy link

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

独秀同学请坐

@censek
Copy link

censek commented Dec 10, 2019

还是没有懂……

@summarychm
Copy link

利用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);

@MrZ2019
Copy link

MrZ2019 commented Jan 2, 2021

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

@1684838553
Copy link

  var i = 1
  Number.prototype.valueOf = function(){
      return i++
  }
  var a = new Number(i)
  if(a==1 && a==2 && a==3){
      console.log(true,typeof a)
  }

把“==”换成“===”不能为true
在这里,a的数据类型为object

@xiaoqiangz
Copy link

const a = { value: 0 }
a.valueOf = function() {
return this.value +=1
}
console.log(a==1 && a==2 && a==3)

var value = 0
Object.defineProperty(window, 'b',{
  get: function() {
    return this.value +=1
  }
} )
console.log(b === 1 && b === 2 && b === 3)

var arr = [1,2,3]
Object.defineProperty(window, 'c', {
  get: function() {
    return arr.shift()
  }
})
console.log(c === 1 && c === 2 && c === 3)

@dragon-sing
Copy link

let returnValue = 0;
Object.defineProperty(globalThis, "a", {
  get: function () {
    return ++returnValue;
  },
});

console.log("结果:", a === 1 && a === 2 && a === 3);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests