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

第十一题:如何让(a==1 && a==2 && a==3)的值为true #11

Open
Ray-56 opened this issue Aug 21, 2019 · 2 comments
Open

第十一题:如何让(a==1 && a==2 && a==3)的值为true #11

Ray-56 opened this issue Aug 21, 2019 · 2 comments
Labels
JavaScript 解释型编程语言

Comments

@Ray-56
Copy link
Owner

Ray-56 commented Aug 21, 2019

如何让(a==1 && a==2 && a==3)的值为true?改为===呢?

@Ray-56 Ray-56 added the JavaScript 解释型编程语言 label Aug 21, 2019
@GenXiaoLe
Copy link
Collaborator

GenXiaoLe commented Aug 22, 2019

a == 1 && a == 2 && a == 3

let a = {
  value: 1,
  toString() {
    return a.value++;
  }
}

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

PS: 这里利用了 对象{}的原生属性 toString, 他会在对象运行时先执行,还可以使用valueOf,valueOf比toString先运行。

a === 1 && a === 2 && a === 3

  • 第一种方法 使用Object.defineProperty拦截
var value = 0; 
Object.defineProperty(window, 'a', {
    get: function() {
        return this.value += 1;
    }
});

console.log(a === 1 && a === 2 && a === 3)
  • 第二种方法 直接使用字符编码
var aᅠ = 1;
var a = 2;
var ᅠa = 3;
console.log(aᅠ === 1 && a === 2 && ᅠa=== 3);

@MMmaXingXing
Copy link

1、a==1 && a==2 && a==3

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

console.log((a==1 && a==2 && a==3));
在 js == 比对中,js代码会执行类型的强制转换,转换规则如下

 1、如果类型为基本类型,就返回这个值;
 2、如果类型为对象,就返回对象的valueOf(),如果返回类型为基本类型,就返回这个值;
 3、以上均未通过,则执行值的toString();
 4、还不行,就抛出类型错误;

2、a===1 && a===2 && a===3

var value = 0;
Object.defineProperty(window, 'a', {
  get: function () {
    return this.value += 1
  }
})

console.log(a===1 && a===2 && a===3);
在 js === 比对中,为什么也可以返回true呢?

当当当,主要原因是Proprety(属性描述符)函数

属性描述符函数,有两个方法,get 和 set,通过get或者set,可以强制键值,设定可选键值,正常对象通过Proprety设置的强制键值,可以用Object. 来使用,因此,以上方法先设置一个可以拿到的值,然后比对,就实现了题目需求(注:由于题目是直接 a === b, 因此,首先将a挂载到了windows上)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript 解释型编程语言
Projects
None yet
Development

No branches or pull requests

3 participants