zoukankan      html  css  js  c++  java
  • 你不知道的JavaScript(一)数据类型

    ECMAScript 规范地址:
    http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

    有过WEB前端开发经验的朋友都知道JavaScript是一种弱类型的语言,定义变量时无需指定变量类型,任一类型的值都可以赋值给该变量。正确的理解每一种数据类型,在适当的时候进行类型转换对我们编程是很有帮助的。

    例如我们有一个多于两位的整数,抛开位数不管,我们要获取从左到右数第二位数字,这时候將整数转换为string是比较方便的。

        var num = 1234566;
        var strNum = num + "";
        alert(strNum[1]);//值为2

    这样的例子很多,笔者不做过多介绍。JavaScript总共定义了七种内置类型,分别如下:

    • null
    • undefined
    • boolean
    • number
    • string
    • object
    • symbol—ECMAScript 6.0规范新增

    接下来我们使用typeof操作符,来检查给定的值属于哪种类型,typeof操作符会返回该值的类型字符串。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>exam_2</title>
    </head>
    <body>
    <div>
        <script type="text/javascript">
            document.writeln(typeof "hello world!");
            document.writeln("<br/>");
            document.writeln(typeof 123.1);
            document.writeln("<br/>");
            document.writeln(typeof Symbol());
            document.writeln("<br/>");
            document.writeln(typeof [1,2,3]);
            document.writeln("<br/>");
            document.writeln(typeof {name:"Rongbo_J",age:23});
            document.writeln("<br/>");
            document.writeln(typeof /^[1-9]$/);
            document.writeln("<br/>");
            document.writeln(typeof true);
            document.writeln("<br/>");
            document.writeln(typeof undefined);
            document.writeln("<br/>");
        </script>
    </div>
    </body>
    </html>

    在浏览器中运行可以看到输出的类型字符串:

    这里写图片描述

    JS中的字符串属于string类型,数值(不区分整数和浮点数)都属于number类型,symbol类型为ECMAScript6.0规范新增,通过Symbol()调用产生。数组、对象、正则表达式都属于object类型,ture/false两个值属于boolean类型。undefined表示变量值未指定或变量未声明,单独属于一个类型undefined。

    此外这里有一些特例:

    document.writeln(typeof null);//输出object

    null和undefined类似,一个值作为一个类型,我们使用typeof null 应该返回”null”字符串才对,那这里为什么会返回”object”呢?

    你可能不知道其实这是JavaScript最初设计上的一个Bug,有很多已经存在的WEB系统都使用类似下面的代码来检测null值:

    var a = null;
    if(!a && typeof a == "object"){};

    如果修复了这个bug,将会导致现存的WEB系统出现更多的Bug,所以这个bug一直持续了近20年,而且以后也不可能会修复。

    再来看一个例子:

            var func = function(){
    
            };
            document.writeln(typeof func);//页面输出function
            document.writeln("<br/>");

    这里我们定义一个函数,使用typeof操作符获取类型字符串,页面输出function。读者可能很容易认为function也是JS顶层的内置类型。实际上ECMAScript规范中提到,function类型属于object的”子类型”。
    为了证明这个结论,我们可以这样写代码:

        <script type="text/javascript">
            alert(function(){}.length);
        </script>

    可以看到,语法上没有任何问题:

    这里写图片描述

    最后再来谈谈typeof操作符,下面这段代码再常见不过了:

    var a = 20;
    typeof a;

    一些书籍中说typeof操作符用来获取变量的类型,其实这种说法不是很准确,JavaScript的变量是没有类型这个概念的,类型是和变量的值相关的。
    上面的代码实际上等价于:

    typeof 20;

    准确的描述应该是:typeof操作符用来获取变量的值的类型。

  • 相关阅读:
    在子线程中更新ProgressBar为null
    有关ContentProvider及相关一系列的简单用法(持续添加)
    Android内容提供者使用及创建
    Android中关于时间的操作
    Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
    处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)
    iOS开发之如何跳到系统设置里的各种设置界面
    Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
    xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
    PresentViewController切换界面(一些系统自带的页面切换动画)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468857.html
Copyright © 2011-2022 走看看