• 由一次代码优化想到的Js 数据类型


    引子:

    上周三进行了代码优化,其中有一个很普遍的代码,例如:

      if(test =="") {dothis();}else{dothat()} ----->可以简化为 !test ? dothis():dothat();

      if(test =="") {dothis()}     ----->可以简化为 !test&&dothis();

    看这个问题简化的根源,其实就是对test的值进行判断,判断是否为false或者是true,如果test==""就执行dothis()这个函数,这个其实就是类型的判断问题,看来""就是一个false,于是我联想,还是其他的吗?

    是有的,比如0,false,null,undefined,NaN,我写了一个例子来测试下:

    <!DOCTYPE HTML>
    <html >
    <head>
        <meta charset="gbk">
        <title></title>
        <script type="text/javascript">
        if(false || null || undefined || '' || 0 || NaN){
            alert(1);
        }else{
            alert(2);
        }
        </script>
    </head>
    <body>    
    </body>
    </html>

    上述代码我在各个浏览器下输出为结果2,可见js中是将这6种类型的值当做false的,还有没有其他的,目前我只想到这些,不过由这个的变体有很多,应用也很多,在函数中,对语句中等等的。。

    Js 数据类型

     对于这个主题,首先来看几个问题,如果你对这几个问题很清楚的话,那就请直接跳过吧,不用接着往下看了,如果不清楚,建议你还是看看。

      1)如果判断函数?function 和object的联系是什么?

      2)typeof 和instanceof 的区别是什么和作用是什么?

      3)undefined 和null 有什么区别?

      4)js 有哪几种基本的数据类型?

      5)Undefined,undefined,’undefined’分别是什么?

      6)typeof null  ,null instanceof Object 的值是什么

    关于类型,不同的书上有很多的不同的说法,

      首先看看ECMA 是怎么说的,ECMA262-5上说 ECMAScript的类型是Undefined,Null,Boolean,String,Number,Object,每种类型对应一种值,分别是undefined,null,true/false, "elements",number,

    a collection of prototies,每种类型都有一个对应的值,分别为 ‘undefined’,'null','boolean','string','number','object'.这种说法不能解释function 是什么类型,null 和undefined 的区别

      javascript高级教程第一版(p11页)中说,js只有5中原始的基本数据类型(Undefined,Null,Boolean,String,Number),很明显不对。那么,对象是是什么呢?到第二版中,将Object增加进来了,说Object是
    一种复杂的数据类型。所有的值都将是上述6种类型之一,我觉得这种说法还靠谱一点,但是如果 是函数呢?这就说不清楚它属于哪一类了。

      aimingoo 提到javascript中两套类型系统,一个是基本数据类型,另外一个是对象类型系统,基本数据类型包括6种,分别是undefined,string,null,boolean,function,object,基本数据类型是通过typeof

    来检测的,对象类型系统是以基础类型系统为基础的,对象类型系统通过instanceof来检测,对象类型与基本数据类型存在着对应的关系,例如String->sting, Boolean-> boolean,Number->number,他们只是映射,本质上

    是不同的,undefined,string,null,boolean 是值类型的。function,object 是引用类型的。String,Boolean,Number 类均是object类型,是Object的子类。Function() 也是引用类型,所有的引用类型均是Object的子类。

      我觉得通过两套类型系统理解js中的数据类型是比较靠谱的。首先它通过typeof 和instanceof 来区别基本数据类型和对象类型,不同的对象类型通过 a instanceof Type 来判断是否是其相应的类型,

    例如:alert(typeof null ) 结果是 “object”,但是alert(null instanceof Object)  结果是false 这个说明null 是对象,但是它不是Object的子类,其次,它能够解答 “aaaa”.length为什么是4,这个是一个装箱操作,

    当.运算符发现左边的操作数是一个“值类型”数据时,会隐式地调用Object(x)过程将它转为对象,于是"aaaa".length 将被隐式地转化为 String("aaaa").length,而String() 是有length 属性的,所以有这个值4

    回到本文开始处的几个问题,很明显都可以解释了:

      1)如果判断函数?function 和object的联系是什么?

         通过typeof 来判断,function和object都是引用类型,函数的基本数据类型,object是对象类型,function是object的子类

      2)typeof 和instanceof 的区别是什么和作用是什么?

        typeof 用来判断基本数据类型,instanceof 来判断对象类型, 但function 有点特殊 alert(typeof function(){}) //"function"  alert(function(){} instanceof Object)  //true

      3)undefined 和null 有什么区别?

        一个是值类型,一个是引用类型

      4)js 有哪几种基本的数据类型?

        6种:undefined,boolean,string,number,object,function

      5)Undefined,undefined,’undefined’分别是什么?

        Undefined 是类型,undefined 是值,’undefined‘是类型的名称

      6)typeof null  ,null instanceof Object 的值是什么

        ’object‘  ,false

    欢迎大家拍砖。

  • 相关阅读:
    漫谈grpc 3:从实践到原理,带你参透 gRPC
    有关CPU合并写的一个java小实验
    瞎几*把idea中的快捷键,整乱了,恢复默认快捷键
    python创建mysql数据库中文编码问题
    python2.x print打印不换行
    解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
    uniGUI学习之Cookie(54)
    博客园自定义标题背景颜色条【自用】
    亲测解决 github 访问慢的问题
    转: JVM规范系列第1章:引言
  • 原文地址:https://www.cnblogs.com/yupeng/p/2512077.html
Copyright © 2020-2023  润新知