看到的一个有意思的问题,一般来说我们看到这个问题的第一反应是不能,因为一个变量一般只能为一个值,不能同时为多个值。但是上面这个问题在某些特殊的情况下确实是有可能是成立的。

劫持valueOf方法或者toString方法

先来看看如下代码:

当遇到==的时候,会先调用valueOf()方法,这个属于隐性类型转换,之前的文章有讲过: js的隐性类型转换与valueOf和toString

由于我们定义的a属于Object,因此默认的valueOf()返回的是这个对象本身,不是一个简单类型,因此我们劫持toString()方法也是可以的,如下:

数组

大家先试试下面的代码:

这个代码就非常巧妙了,因为数组和数字比较的时候会调用toString()方法,这时数组会调用join()方法返回结果,这个时候将join变成shift方法,shift方法会删除数组的第一个数字并返回。

defineObject

利用definObject将a挂在window下,在get方法里返回一个自增加的数字:

这种方法,即使a===1&&a===2&&a===3全等也是成立的。

with

和defineObject类似,在get里面得到一个自增加的数字:

这种方法,即使a===1&&a===2&&a===3全等也是成立的。

Symbol.toPrimitive

es6中的Symbol用来创建一个唯一不重复的键,其中的Symbol.toPrimitive在每次进行类型转换的时候调用,代码如下:

es6写法如下:

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字