关于we != we && we == we问题联想

2019年07月03日Web前端0

起因是这样的,在群里见到同学发了张图,如下:

于是便联想到了a==1&&a==2&&a==3这道题中的defineProperty方法,便来实现下(仅针对这道题目。。)。

we != we && we == we

看到这道题,输出false肯定是很容易的,那他是否可以为true呢? we != we,1不就不等于0么,。we==we,1不就等于1么。那这样就好办了,在每次获取we的值对比时,我们可以利用defineProperty方法修改掉他的get方法,

只要保证前两次的值不等(123!=456),后两次值相等(undefined==undefined)就行了。当然重写toString和valueOf也是可以的。 所以,这题答案想要true或false都可以嘛。

前面讲到了a==1&&a==2&&a==3这题,正好也来看一波。

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

toString或valueOf

在进行等号比较的时候,值会先调用他的valueOf方法,而当valueOf返回的不是基本类型的时候,就会去调用toString方法。

所以我们可以对valueOf和toString重写,达到目的。

defineProperty

前面提到的defineProperty同样可以做到这一点。

数组

数组调用toString方法时会隐含调用join方法,我们可以重写掉他的join方法,

有一次达到了目的。

symbol

原理与toString和valueOf差不多。

总结

这些方式看似没有章法,很神奇,其实只要掌握了==时,js实际做了哪些事,这些方法就不成问题了。

涉及代码的详细地址:github