JS中,如何实现a==1&&a==2&&a==3为true

11,410 阅读2分钟
JS中,如何实现a==1&&a==2&&a==3为true 写在前面

如果a仅仅是一个常量,在同一种语言中,显然题目是不会成立的,环境限制为JS,因此就要利用JS语言的特点,使得上述结果为true,方法及原理如下:

js中,当涉及到加运算或==判断时,会触发隐式转换规则,转换的目的是将两个值转换为相同的数据类型,具体的转换规则如下:

  • 两个引用类型比较,只需判断它们是不是引用了同一个对象,是返回true,否则为false。

  • undefined 和 null 两者互相比较或者与自身比较,结果是true。它俩与其他任何值比较的都为false。

  • NaN与任何值比较包括它自身结果都是false。

  • 引用类型和基本数据类型进行比较,两者最后都会转换成基本数据类型再进行比较。

  • String,Boolean,Number中的任意两个进行比较,最后都会转为Number类型再进行比较。



方法一:a是个对象,重写对象的valueOf方法


源码

valueOf.JPG

原理分析

a是一个对象,JS中,当复杂类型和数字做比较时,会先调用复杂类型的valueOf方法,获取类型的原始值,如果得到的是一个string类型则直接返回原始值,如果得到的不是一个string类型,则继续调用toString方法,得到string类型之后返回。

上述方法,每次获取a的值,都重写它的valueOf方法,从而返回我们想要的值。

方法二:a是个对象,重写对象的toString方法
源码

toStringJPG.JPG

原理分析

原理同方法一,只不过,方法一是在a对象调用valueOf方法时劫持,而此方法原理是:转换类型时,发现a是一个复杂类型,调用valueOf方法,返回时object类,不是一个基本类型,再调用toString方法,这个时候,我们劫持了toString方法,在toString方法中写我们的逻辑。

方法三:代理
源码

proxy.JPG

原理分析

使用ES6新增的代理,在读取对象属性时重写对象的get方法,就可以得到想要的结果。

其他方法: 这里还提供了其他5种写法,这里不再赘述,如有兴趣请移步这里:

链接:https://blog.csdn.net/MFWSCQ/article/details/105106757