你不知道的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操作符用来获取变量的值的类型。

posted on 2015-05-15 19:00  岚之山  阅读(176)  评论(0编辑  收藏  举报

导航