如何让(a==1&&a==2&&a==3)成立

原文链接:https://www.jianshu.com/p/b7831b06f61a

上班摸鱼的时候,刷到了一篇很有意思的文章,可以先看看上面的链接;

对于我这种小白来说,这种判断条件,似乎,好像,可能,大概不成立吧。然后我仔细看了看(第一种方法),

第一遍,嗯?这是什么操作???

第二遍,哦!原来是这样(ps:我去翻书了--javaScript高级教程   相等操作符那一节)

ok,弄明白了,就是把a当对象,重写相等运算符比较之前进行的类型转换方法---toString

等等,toString ????  书上明明写的对象转换类型,调用的是valueof() 啊;

实践出真知,当然敲代码才能弄明白了

1、先敲了一遍网上的代码↵

window.onload=function(){
			var a = {
				i:1,
				
				toString:function(){
					console.log('toString')
					return a.i++
				}
			}
			
			if(a==1&&a==2&&a==3){
				console.log('true')
			}else{
				console.log(false)
			}
		}

控制台输出

嗯,果然是大佬,代码完全没问题呢,成功得到了true;那么,难道是书本错了,其实是调用toString()的转换方法?于是,我又敲了一次代码

2、把toString() 换成valueOf()    (๑•̀ㅂ•́)و✧

window.onload=function(){
			var a = {
				i:1,
				valueOf:function(){
					console.log('valueOf')
					return a.i++
				}
			}
			
			if(a==1&&a==2&&a==3){
				console.log('true')
			}else{
				console.log(false)
			}
		}

控制台输出

哦吼!!!!也成功了 !!! 

等等,我高兴个什么劲啊,为什么都成功了啊

于是,我进行了第三步操作

3、同时重写方法,看调用哪个

window.onload=function(){
			var a = {
				i:1,
				valueOf:function(){
					console.log('valueOf')
					return a.i++
				},
				toString:function(){
					console.log('toString')
					return a.i++
				}
			}
			
			if(a==1&&a==2&&a==3){
				console.log('true')
			}else{
				console.log(false)
			}
		}

控制台输出

emm,很明显了,都被重写的情况下,调用了valueOf() ,说明书本没错,调用的是对象的valueOf()方法,转换位数值类型

 

但是,为什么呢?(°ー°〃)

为什么,只重写toString()的时候,调用了呢

 

深思熟虑。。。。。

于是,我又写了一份代码,删除了所有重写方法

window.onload=function(){
			var a = {
				i:1
			}
			
			if(a==1&&a==2&&a==3){
				console.log('true')
			}else{
				console.log(false)
			}
		}

控制台输出

 

似乎还是有点迷?

ok,再加一条代码

window.onload=function(){
			var a = {
				i:1
			}
			console.log(a.valueOf())
			console.log(a.toString())
			if(a==1&&a==2&&a==3){
				console.log('true')
			}else{
				console.log(false)
			}
		}

控制台输出

然后,我在书上翻到了这么一段话

 

ok,一切都说得通了,因为a本身定义的是对象,所以像调用了valueOf进行数值比较,发现返回的值并不能转换为数值,所以调用了toString方法,得到了[Object Object],很熟悉吧,对象转数值的结果,所以对比后得到了false

但是因为我们重写了valueOf和toString 方法,方法有了数值类型的返回值,所以==得到了正确的比较结果,返回了true;

而且因为valueOf转换在toString之前,所以比较完成之后就不再调用toString了;

而因为默认valueOf得到的值并不能进行比较,所以调用了重写后toString方法;

 

完全ojbk(* ̄▽ ̄*)o

果然,我是小菜鸡呢,一开始就忘记了a是个对象啊,想当然的就以为可以直接a.i进行比较了;忽略了是对象比较,而不是对象的属性进行比较。。。。。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值