第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 操作符的例子:
这几个例子说明,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,例如:
这个例子只声明了变量message,但未对其进行初始化。比较这个变量与undefined 字面量,结果表明它们是相等的。
这个例子与下面的例子是等价的:
PS:一般而言,不存在需要显式地把一个变量设置为undefined 值的情况。字面值undefined 的主要目的是用于比较,而ECMA-262
第3版之前的版本中并没有规定这个值。第3 版引入这个值是为了正式区分空对象指针与未经初始化的变量。
------------------------------------------------------------------------------------------------------------------------------------------------
不过,包含undefined 值的变量与尚未定义的变量还是不一样的。看看下面这个例子:
运行以上代码,第一个警告框会显示变量message 的值,即"undefined"。而第二个警告框——由于传递给alert()函数的是
尚未声明的变量age——则会导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof 操作符检测其数据类型。
------------------------------------------------------------------------------------------------------------------------------------------------
然而,令人困惑的是:对未初始化的变量执行typeof 操作符会返回undefined 值,而对未声明的变量
执行typeof 操作符同样也会返回undefined 值。来看下面的例子:
因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。
PS:即便未初始化的变量会自动被赋予undefined 值,但显式地初始化变量依然是明智的选择。
如果能够做到这一点,那么当typeof 操作符返回"undefined"值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。
----------------------------------------------------------------------------------------------------------------------------------
3.4.3 Null类型
Null 类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用
typeof 操作符检测null 值时会返回"object"的原因,如下面的例子所示:
这样一来,只要直接检查null 值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:
if (car != null){
// 对car 对象执行某些操作
}
实际上,undefined 值是派生自null 值的,因此ECMA-262 规定对它们的相等性测试要返回true:
alert(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(),如下例所示:
可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean 值。
至于返回的这个值是true 还是false,取决于要转换值的数据类型及其实际值。
下表给出了各种数据类型及其对应的转换规则。
这些转换规则对理解流控制语句(如if 语句)自动执行相应的Boolean 转换非常重要,请看下面的代码:
由于存在这种自动执行的Boolean 转换,因此确切地知道在流控制语句中使用的是什么变量至关重要。
错误地使用一个对象而不是一个Boolean 值,就有可能彻底改变应用程序的流程。
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 值,就有可能彻底改变应用程序的流程。
相关文章推荐
- JavaScript第三课——数据类型(typeof操作符、Undefined类型、Null类型、Boolean类型)
- JavaScript数据类型(一)——typeof操作符、Boolean、Null和Undefined
- js的基本数据类型有哪些? ECMAScript中有5中简单数据类型(也称为基本数据类型): Undefined、Null、Boolean、Number和String。还有1中复杂的数据类型————
- JavaScript基本类型值-Undefined、Null、Boolean
- javascript基础学习(1)数据类型--undefined和null、boolean
- js的null和undefined的区别-js基本数据类型
- 第3章:基本概念----语法 / 数据类型 / 语句
- 【JS】typeof原始类型 string:"string" number:"number" boolean:"boolean" undefined:"undefined" 除了null
- 第3章 基本概念(3)数据类型:Number类型 String类型 Object类型
- JS的数据类型:number,string,boolean,null,undefined,object,function
- Javascript高级程序设计——3.数据类型(1)typeof、null、undefined、boolean、number
- 104----oracle基本概念,启动,连接, 数据类型,常见案例,集合操作符
- Js———数据类型、操作符、语句 (基本概念)
- 【Javascript基础篇】——基本数据类型的特殊类型null,undefined讲解及typeof用法
- JavaScript 基本类型值-Undefined、Null、Boolean
- 嵌入式开发之C基础学习笔记03--基本数据类型,操作符,修饰符等基本概念
- 基本数据类型Undefined和Null的区别和联系
- JS高程NO3--基本概念(语法,数据类型,操作符,语句,函数)
- ECMAScript——基本数据类型之null和undefined
- MongoDB学习(二):数据类型和基本概念