最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript浅析 -- 类型转换和比较

    正文概述 掘金(向上的大雄)   2021-07-04   520

    先看看如下几个问题,如果都能答对且知道为什么那么可以不用接着往下看了(当然想要接着看我是不会拒绝的哈哈):

    console.log('' == 1); // false
    console.log(' ' == 1); // false
    console.log(true == 1); // true
    console.log(true == '1'); // true
    console.log(true == '2'); // false
    console.log(' ' == true); // false
    
    console.log("0" == true); // false
    console.log("0" == false); // true
    console.log("00" == false); // true
    console.log("0.00" == false); // true
    
    console.log(undefined == null);  // true
    console.log(null == 'null'); // false
    console.log({} == true);  // false
    console.log([] == true);  // false
    
    var obj = { 
      a: 0, 
      valueOf: function(){return 1} 
    } 
    console.log(obj=='[object Object]');  // false
    console.log(obj==1);  // true
    console.log(obj==true);  // true
    
    if ("") {
        console.log('empty')
    } // 无
    
    if (" ") {
        console.log('blank')
    } // blank
    
    if ([0]) {
        console.log('array')
    } // array
    
    if('0.00'){
      console.log('0.00')
    } // 0.00
    

    相信看了上面的题,一些初学的小伙伴已经开始怀疑人生了,不急不急,我们下面就先讲讲两个知识点,然后最后我们再来一一解析题目,到时候就很好理解了。

    一、数据类型的互相转换

    1. 其他类型转成Number

    数据类型转为值
    String纯数字的字符串转为对应的数字,空字符串和空格字符串是0,其他字符变成NaNBooleantrue为1,false为0Object调用valueOf()的返回结果,没有则返回toString()结果,若对象没有valueOf()和toString()则返回NaNnull返回0undefined返回NaN
    • Number([])返回0,Number([3])返回3,Number([1, 2])返回NaN。

    2. 其他类型转成String

    数据类型转为值
    Number转为对应数字的字符串形式,NaN是“NaN”Booleantrue为"true",false为"false"Object返回toString()的返回值,默认是“[object Object]”null返回"null"undefined返回"undefined"

    3. 其他类型转成Boolean

    数据类型转为true的值转为false的值
    Number任何非零数字(包括无穷大)0、-0和NaNString任何非空字符“”(空字符串)Object任何对象nullnullundefinedundefined

    二、数据类型的比较

    首先强调一点,这里所讲的是==比较,而不是===比较,因为只有==在互相比较的时候会进行隐式转换再做比较,而具体规则如下:

    1. Number、String、Boolean三者的互相比较,都先转换为数字再进行比较。
    2. Object和其他作比较,调用toPrimitive的返回值进行比较(先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果)。
    3. null和undefined的比较不做转换,且null==undefined返回true(null===undefined返回false)。
    4. NaN不与任何值相等,即使NaN==NaN返回的也是false。

    三、答案解析

    好了,根据上面所讲的两点,现在我们再来看看开始的题目,一一解释下:

    1. 首先看这些题目:
    console.log('' == 1); // false
    console.log(' ' == 1); // false
    console.log(true == 1); // true
    console.log(true == '1'); // true
    console.log(true == '2'); // false
    console.log(' ' == true); // false
    
    console.log("0" == true); // false
    console.log("0" == false); // true
    console.log("00" == false); // true
    console.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); // false
    console.log(0 == 1); // false
    console.log(1 == 1); // true
    console.log(1 == 1); // true
    console.log(1 == 2); // false
    console.log(0 == 1); // false
    
    console.log(0 == 1); // false
    console.log(0 == 0); // true
    console.log(0 == 0); // true
    console.log(0 == 0); // true
    

    这样做了转换之后的比较是不是就一目了然了? 2. 根据比较规则的第2点 “Object和其他作比较,调用toPrimitive的返回值进行比较(先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果)”,由于Number({})为NaN,Number([])为0,下面的题目

    console.log({} == true);  // false
    console.log([] == true);  // false
    
    var obj = { 
      a: 0, 
      valueOf: function(){return 1} 
    } 
    console.log(obj=='[object Object]');  // false
    console.log(obj==1);  // true
    console.log(obj==true);  // true
    

    就变成

    console.log(NaN == 1);  // false
    console.log(0 == 1);  // false
    
    var obj = { 
      a: 0, 
      valueOf: function(){return 1} 
    } 
    console.log(1 == NaN);  // false
    console.log(1 == 1);  // true
    console.log(1 == 1);  // true
    
    1. 根据转换规则第3点 “null和undefined的比较不做转换,且null==undefined返回true”,下面就不用解释了吧?
    console.log(undefined == null);  // true
    console.log(null == 'null'); // false
    
    1. 而对于这种if的判断,我们可以直接转换成Boolean。由于任何对象和任何非空字符串的布尔值都是true,有Boolean('')为false,Boolean(' ')、Boolean([0])、Boolean({})为true。
    if ("") {
        console.log('empty')
    } // 无
    
    if (" ") {
        console.log('blank')
    } // blank
    
    if ([0]) {
        console.log('array')
    } // array
    
    if('0.00'){
      console.log('0.00')
    } // 0.00
    
    1. 最后补充两道题:
    console.log(!" " == true);  // false
    console.log(!" " == false);  // true
    

    由于“!取反”的优先级高于“==”,所以先做布尔转化,有Boolean(" ")为true,!Boolean(" ")为false。则转化成如下:

    console.log(false == true);  // false
    console.log(false == false);  // true
    

    此时由于是两个布尔值做比较所以就不用再做转化数字的操作。over~


    起源地下载网 » JavaScript浅析 -- 类型转换和比较

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元