当前位置: 首页 > Web前端 > HTML

JavaScript解析--类型转换与比较

时间:2023-03-28 19:38:57 HTML

先来看看下面的问题,如果你能答对并且知道为什么,那你就不用往下看了(当然我不会拒绝的想继续看哈哈):console.log(''==1);//falseconsole.log(''==1);//falseconsole.log(true==1);//trueconsole.log(true=='1');//trueconsole.log(true=='2');//falseconsole.log(''==true);//falseconsole.log("0"==true);//falseconsole.log("0"==false);//trueconsole.log("00"==false);//trueconsole.log("0.00"==false);//trueconsole.log(undefined==null);//trueconsole.log(null=='null');//falseconsole.log({}==true);//falseconsole.log([]==true);//falseCopycodevarobj={a:0,valueOf:function(){return1}}console.log(obj=='[objectObject]');//falseconsole.log(obj==1);//trueconsole.log(obj==true);//trueif(""){console.log('empty')}//noneif(""){console.log('blank')}//blankif([0]){console.log('array')}//arrayif('0.00'){console.log('0.00')}//0.00复制代码相信看完上面的问题,有些初学者已经开始怀疑人生了,别着急,我们先说两个知识点,最后再把题目一一分析,到时候就很容易理解了。1、数据类型的相互转换。其他类型转为Number数据类型,转为valueStrings。纯数字串被转换成相应的数字。空串和空格串为0,其他字符变为NaNBoolean。true为1,false为0对象返回调用valueOf()的结果,如果没有toString()结果,如果对象没有valueOf()和toString(),则返回NaNnull,返回0undefined,返回NaNNumber([])返回0,Number([3])返回3,Number([1,2])返回NaN。其他类型转换为String数据类型,valueNumber转换为对应数字的字符串形式,NaN为“NaN”Booleantrue为“true”,false为“false”对象返回toString()的返回值,默认为“[objectObject]”null返回“null”undefined返回“undefined”其他类型转换为布尔数据类型转换为真值转换为假值Number任意非零数(包括无穷大)0、-0和NaNStringAny非空字符""(空字符串)ObjectAnyobjectNonullNonullundefinedNoundefined二、数据类型的比较首先要强调的是,我们这里说的是==比较,不是===比较,因为只有==相互比较有时在比较之前会进行隐式转换,具体规则如下:Number、String、Boolean相互比较,先转换为数字再比较.Object与其他对象进行比较,调用toPrimitive的返回值进行比较(先尝试调用.valueOf方法获取结果,如果没有定义再尝试调用.toString方法获取结果)。null和undefined比较不转换,null==undefined返回true(null===undefined返回false)。NaN不等于任何值,即使NaN==NaN返回false。3.答案分析。根据以上两点,我们来看第一个问题,一一解释:先看这几个问题:console.log(''==1);//falseconsole.log(''==1);//falseconsole.log(true==1);//trueconsole.log(true=='1');//trueconsole.log(true=='2');//falseconsole.log(''==true);//falseconsole.log("0"==true);//falseconsole.log("0"==false);//trueconsole.log("00"==false);//trueconsole.log("0.00"==false);//true复制代码按照“Number,String,Boolean相互比较,先转换成数字再比较”,所以上面几个比较都会先转换,而Number(''),Number(''),Number('0'),Number('00'),Number('0.00)都是0,而Number(true)是1,Number(false)是0。这时候标题实际上变成了如下:console.log(0==1);//falseconsole.log(0==1);//falseconsole.log(1==1);//trueconsole.log(1==1);//trueconsole.log(1==2);//falseconsole.log(0==1);//falseconsole.log(0==1);//falseconsole.log(0==0);//trueconsole.log(0==0);//trueconsole.log(0==0);//true复制代码,转换后是不是一目了然?2.根据比较规则第二点“Object与他人比较”,调用toPrimitive的返回值进行比较(尝试先调用.valueOf方法获取结果。如果没有定义,尝试调用.toString方法得到结果)",因为Number({})为NaN,Number([])为0,下面标题console.log({}==true);//falseconsole.log([]==true);//falsevarobj={a:0,valueOf:function(){return1}}console.log(obj=='[objectObject]');//falseconsole.log(obj==1);//trueconsole.log(obj==true);//true复制代码变为console.log(NaN==1);//falseconsole.log(0==1);//falsevarobj={a:0,valueOf:function(){return1}}console.log(1==NaN);//falseconsole.log(1==1);//trueconsole.log(1==1);//true根据转换规则第三点“null和undefined比较不转换,null==undefined返回true”复制代码,下面就不用解释了吧?console...和任何非空st环为真,有Boolean('')为假,Boolean(''),Boolean([0]),Boolean({})为真。if(""){console.log('empty')}//什么都没有if(""){console.log('blank')}//blankif([0]){console.log('array')}//arrayif('0.00'){console.log('0.00')}//0.00复制代码并在末尾添加两个问题:console.log(!""==true);//falseconsole.log(!""==false);//true复制代码由于“!Negative”的优先级高于“==”,所以先进行布尔转换,Boolean("")为true,!Boolean("")为false。然后转化为:console.log(false==true);//falseconsole.log(false==false);//truecopycode此时因为是比较两个布尔值,所以不需要进行数字转换操作。over~最后,如果您觉得本文对您有帮助,请点个赞。或者可以加入我的开发交流群:1025263163互相学习,我们会有专业的技术解答。如果您觉得这篇文章对您有用,请给我们的开源项目一个小星星:https://gitee。com/ZhongBangKe...非常感谢!