您的位置:首页 > 其它

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

2016-12-21 15:19 786 查看
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 值,就有可能彻底改变应用程序的流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐