随笔 - 42,  文章 - 0,  评论 - 12,  阅读 - 51248

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

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

 

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

posted on   coder__wang  阅读(472)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示