ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-25 01:03:35  阅读:174  来源: 互联网

标签:面试题 console log 哈哈 num toString &&


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

// 定义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()来解答。

 

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

标签:面试题,console,log,哈哈,num,toString,&&
来源: https://www.cnblogs.com/coder--wang/p/15056864.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有