第3章 基本概念(2)数据类型:typeof操作符 Undefined类型 Null类型 Boolean类型

本文详细介绍了ECMAScript中的六种数据类型:Undefined、Null、Boolean、Number、String及Object,并探讨了如何使用typeof操作符检测数据类型,以及Undefined与Null类型的特性。

3.4 数据类型

ECMAScript 中有5 种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。

还有1 种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。

ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述6 种数据类型之一。

我的问题:第5章引用类型也讲到Object Array,那么可以说ECMAScript中有5 种基本数据类型和引用类型吗?

3.4.1 typeof操作符

检测给定变量的数据类型

对一个值使用typeof 操作符可能返回下列某个字符串:

  • "undefined"——如果这个值未定义;
  •  "boolean"——如果这个值是布尔值;
  •  "string"——如果这个值是字符串;
  • "number"——如果这个值是数值;
  •  "object"——如果这个值是对象或null;
  •  "function"——如果这个值是函数。

下面是几个使用typeof 操作符的例子:


<!DOCTYPE html>
<html>
<head>
    <title>typeof Example</title>
    <script type="text/javascript">
          
        var message = "some string";
        alert(typeof message);    //"string"
        alert(typeof 95);         //"number"

      
    </script>

</head>
<body>
  
</body>
</html>

这几个例子说明,typeof 操作符的操作数可以是变量(message),也可以是数值字面量。

注意,typeof 是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。

-----------------------------------------------------------------------------------------------------------------------------------------

有些时候,typeof 操作符会返回一些令人迷惑但技术上却正确的值。

比如,调用typeof null会返回"object",因为特殊值null 被认为是一个空的对象引用。

Safari 5 及之前版本、Chrome 7 及之前版本在对正则表达式调用typeof 操作符时会返回"function",

而其他浏览器在这种情况下会返回"object"。

PS:从技术角度讲,函数在ECMAScript 中是对象,不是一种数据类型。然而,函数也

确实有一些特殊的属性,因此通过typeof 操作符来区分函数和其他对象是有必要的。

------------------------------------------------------------------------------------------------------------------------------------------

3.4.2 Undefined类型

Undefined 类型只有一个值,即特殊的undefined。在使用var 声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:


<!DOCTYPE html>
<html>
<head>
    <title>Undefined Example 1</title>
    <script type="text/javascript">
          
        var message;
        alert(message == undefined);    //true

    </script>

</head>
<body>
  
</body>
</html>

这个例子只声明了变量message,但未对其进行初始化。比较这个变量与undefined 字面量,结果表明它们是相等的。

这个例子与下面的例子是等价的:


<!DOCTYPE html>
<html>
<head>
    <title>Undefined Example 2</title>
    <script type="text/javascript">
          
        var message = undefined;
        alert(message == undefined);    //true

    </script>

</head>
<body>
  
</body>
</html>

这个例子使用undefined 值显式初始化了变量message。但我们没有必要这么做,因为未经初始化的值默认就会取得undefined 值。

PS:一般而言,不存在需要显式地把一个变量设置为undefined 值的情况。字面值undefined 的主要目的是用于比较,而ECMA-262

第3版之前的版本中并没有规定这个值。第3 版引入这个值是为了正式区分空对象指针与未经初始化的变量。

------------------------------------------------------------------------------------------------------------------------------------------------

不过,包含undefined 值的变量与尚未定义的变量还是不一样的。看看下面这个例子:


<!DOCTYPE html>
<html>
<head>
    <title>Undefined Example 3</title>
    <script type="text/javascript">
          
        var message;     //这个变量声明之后默认取得了undefined 值
        
        //下面这个变量并没有声明,因为把age注掉了
        //var age
        
        alert(message);  //"undefined"
        alert(age);      //产生错误


      
    </script>

</head>
<body>
  
</body>
</html>


运行以上代码,第一个警告框会显示变量message 的值,即"undefined"。而第二个警告框——由于传递给alert()函数的是

尚未声明的变量age——则会导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof 操作符检测其数据类型。

------------------------------------------------------------------------------------------------------------------------------------------------

然而,令人困惑的是:对未初始化的变量执行typeof 操作符会返回undefined 值,而对未声明的变量

执行typeof 操作符同样也会返回undefined 值。来看下面的例子:


<!DOCTYPE html>
<html>
<head>
    <title>Undefined Example 4</title>
    <script type="text/javascript">
          
        var message;     //这个变量声明之后默认取得了undefined 值
        
        //下面这个变量并没有声明,因为把age注掉了

        //var age
        
        alert(typeof message);  //"undefined"
        alert(typeof age);      //"undefined"



      
    </script>

</head>
<body>
  
</body>
</html>

结果表明,对未初始化和未声明的变量执行typeof 操作符都返回了undefined 值;这个结果有其逻辑上的合理性。

因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。

PS:即便未初始化的变量会自动被赋予undefined 值,但显式地初始化变量依然是明智的选择。

如果能够做到这一点,那么当typeof 操作符返回"undefined"值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。

----------------------------------------------------------------------------------------------------------------------------------

3.4.3 Null类型

Null 类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用

typeof 操作符检测null 值时会返回"object"的原因,如下面的例子所示:


<!DOCTYPE html>
<html>
<head>
    <title>Null Example 1</title>
    <script type="text/javascript">
          
        var car = null;
        alert(typeof car);   //"object"
              
    </script>

</head>
<body>
  
</body>
</html>

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null 而不是其他值。

这样一来,只要直接检查null 值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:

if (car != null){
    // 对car 对象执行某些操作
}

实际上,undefined 值是派生自null 值的,因此ECMA-262 规定对它们的相等性测试要返回true:

alert(null == undefined); //true


<html>
<head>
    <title>Null Example 2</title>
    <script type="text/javascript">
          
        alert(null == undefined);   
              
    </script>

</head>
<body>
  
</body>
</html>

这里,位于null 和undefined 之间的相等操作符(==)总是返回true,不过要注意的是,

这个操作符出于比较的目的会转换其操作数。
------------------------------------------------------------------------------------------------------------------------------------------------

尽管null 和undefined 有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量的值显式地设置

为undefined,可是同样的规则对null 却不适用。

换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null 值。

这样做不仅可以体现null 作为空对象指针的惯例,而且也有助于进一步区分null 和undefined。
-------------------------------------------------------------------------------------------------------------------------------------------------

3.4.4 Boolean类型

Boolean 类型是ECMAScript 中使用得最多的一种类型,该类型只有两个字面值:true 和false。

这两个值与数字值不是一回事,因此true 不一定等于1,而false 也不一定等于0。

以下是为变量赋Boolean 类型值的例子:

var found = true;

var lost = false;

需要注意的是,Boolean 类型的字面值true 和false 是区分大小写的。也就是说,True 和False(以及其他的混合大小写形式)

都不是Boolean 值,只是标识符。

虽然Boolean 类型的字面值只有两个,但ECMAScript 中所有类型的值都有与这两个Boolean 值等价的值。

要将一个值转换为其对应的Boolean 值,可以调用转型函数Boolean(),如下例所示:


<!DOCTYPE html>
<html>
<head>
    <title>Boolean Example 1</title>
    <script type="text/javascript">
          
        var message = "Hello world!";
        var messageAsBoolean = Boolean(message);
        
        alert(messageAsBoolean); //true
 
              
    </script>

</head>
<body>
  
</body>
</html>

在这个例子中,字符串message 被转换成了一个Boolean 值,该值被保存在messageAsBoolean变量中。

可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean 值。

至于返回的这个值是true 还是false,取决于要转换值的数据类型及其实际值。

下表给出了各种数据类型及其对应的转换规则。



这些转换规则对理解流控制语句(如if 语句)自动执行相应的Boolean 转换非常重要,请看下面的代码:


<!DOCTYPE html>
<html>
<head>
    <title>Boolean Example 2</title>
    <script type="text/javascript">
          
        var message = "Hello world!";
        if (message){
            alert("Value is true");
        }

 
              
    </script>

</head>
<body>
  
</body>
</html>

运行这个示例,就会显示一个警告框,因为字符串message 被自动转换成了对应的Boolean 值(true)。

由于存在这种自动执行的Boolean 转换,因此确切地知道在流控制语句中使用的是什么变量至关重要。

错误地使用一个对象而不是一个Boolean 值,就有可能彻底改变应用程序的流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值