《JavaScript高级程序设计》 读书笔记(二)

 

数据类型 

ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):UndefinedNullBooleanNumber
String。还有 1 种复杂数据类型——ObjectObject 本质上是由一组无序的名值对组成的。ECMAScript
不支持任何创建自定义类型的机制,而所有值最终都将是上述 6 种数据类型之一。

 

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

 

不过,包含 undefined 值的变量与尚未定义的变量还是不一样的。看看下面这个例子:
var message; // 这个变量声明之后默认取得了 undefined
// 下面这个变量并没有声明
// var age
alert(message); // "undefined"
alert(age); // 产生错误

 

运行以上代码,第一个警告框会显示变量 message 的值,即"undefined"。而第二个警告框——
由于传递给 alert()函数的是尚未声明的变量 age——则会导致一个错误。对于尚未声明过的变量,只
能执行一项操作,即使用 typeof 操作符检测其数据类型(对未经声明的变量调用 delete 不会导致错
误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。
然而,令人困惑的是:对未初始化的变量执行 typeof 操作符会返回 undefined 值,而对未声明
的变量执行 typeof 操作符同样也会返回 undefined 值。来看下面的例子:
var message; // 这个变量声明之后默认取得了 undefined
// 下面这个变量并没有声明
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
UndefinedExample04.htm
结果表明,对未初始化和未声明的变量执行 typeof 操作符都返回了 undefined 值;这个结果有
其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能
执行真正的操作。

 

浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如, 0.1 0.2
的结果不是 0.3,而是 0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。
例如:
if (a + b == 0.3){ // 不要做这样的测试!
alert("You got 0.3.");
}
在这个例子中,我们测试的是两个数的和是不是等于 0.3。如果这两个数是 0.05 0.25, 或者是 0.15
0.15 都不会有问题。而如前所述,如果这两个数是 0.1 0.2,那么测试将无法通过。因此,永远不
要测试某个特定的浮点数值。

 

NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数
未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以 0 都会导致错误,
从而停止代码执行。但在 ECMAScript 中,任何数值除以 0 会返回 NaN,因此不会影响其他代码的执行。
NaN 本身有两个非同寻常的特点。首先,任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这
个特点在多步计算中有可能导致问题。其次, NaN 与任何值都不相等,包括 NaN 本身。例如,下面的代
码会返回 false
alert(NaN == NaN); //false
针对 NaN 的这两个特点, ECMAScript 定义了 isNaN()函数。这个函数接受一个参数,该参数可以
是任何类型,而函数会帮我们确定这个参数是否“不是数值”。 isNaN()在接收到一个值之后,会尝试
将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"Boolean 值。而任何
不能被转换为数值的值都会导致这个函数返回 true。请看下面的例子:
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false10 是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1

 ① 原书如此,但实际上只有 0 除以 0 才会返回 NaN,正数除以 0 返回 Infinity,负数除以 0 返回-Infinity。 

 

数值转换
3 个函数可以把非数值转换为数值: Number()parseInt()parseFloat()。第一个函数,
即转型函数 Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这 3
函数对于同样的输入会有返回不同的结果。

 

转换为字符串 

数值、布尔值、对象和字符串值(没错,每个字符串也都有一个 toString()方法,该方法返回字
符串的一个副本)都有 toString()方法。但 null undefined 值没有这个方法。

在不知道要转换的值是不是 null undefined 的情况下,还可以使用转型函数 String(),这个
函数能够将任何类型的值转换为字符串。 

 

Object类型
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建
的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定
义对象,如下所示:
var o = new Object();

posted @ 2016-12-29 13:08  GIScript  阅读(286)  评论(0编辑  收藏  举报