面试题之a==1a==2a==3和a===1a===2a===3

编程入门 行业动态 更新时间:2024-10-15 04:24:30

<a href=https://www.elefans.com/category/jswz/34/1769418.html style=面试题之a==1a==2a==3和a===1a===2a===3"/>

面试题之a==1a==2a==3和a===1a===2a===3

这道面试题现在应该挺常见了吧:

//定义a,使下面代码可以打印出"哈哈!"if(a==1&&a==2&&a==3){console.log("哈哈!");}else{console.log("嘻嘻!");};

我当初看到题目的第一反应:what?一个数可以同时和三个数相等?会不会是toString隐式转换?于是就尝试了一下:

var a={num:1,toString:function(){return a.num++;}
}
if(a==1&&a==2&&a==3){console.log("哈哈");
}else{console.log("嘻嘻!");
}//=> "哈哈"

以上代码运行结果证实了猜想,对象a跟数字类型比较的时候,会进行隐式转换,这里我们重写了它的toString方法,使其每比较一次返回的结果就加1。猜想一下,如果将a==1&&a==2&&a==3改为a===1&&a===2&&a===3,这种方法还管用吗?

var a={num:1,toString:function(){return a.num++;}
}
if(a===1&&a===2&&a===3){console.log("哈哈");
}else{console.log("嘻嘻!");
}
//=> "嘻嘻"

结果发现===全等并不行,究其原因还是因为toString方法返回的都是字符串,1==="1"肯定是false了。这样看来隐式转换好像对全等的情况下并不管用。还有没有一种方法,可以使每次a作比较的时候返回的不是字符串而是数字呢?

Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。它会控制对象属性值的getter和setter。

num=1;
Object.defineProperty(window,'a',{get:function(){return num++;}
})
if(a===1&&a===2&&a===3){console.log("哈哈!");
}else{console.log("嘻嘻!");
}
/=> "哈哈"

到这就已经有了答案,如果下次遇到这种题,主要看它考的是 == 还是 ===,前者以上俩种方法都能实现,后者的话不能使用隐式转换了,可以利用Object.defineProperty()来解答。

脚踏实地行,海阔天空飞~

更多推荐

面试题之a==1a==2a==3和a===1a===2a===3

本文发布于:2024-02-14 16:09:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1764028.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:面试题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!