1.5 值与类型

如果你向手机店的店员咨询某款手机的价格,他会回答说“99.99”(也就是99.99美元),那么他给你的是一个实际的美元数,表示购买手机需要付的金额(加上税)。如果你想要买两部这款手机,那么可以很容易地算出价格为199.98美元。

如果这个店员拿起另一个类似的手机,声称它是“免费的”(很可能要签约),这时他并没有给出一个具体的数字,而是价格($0.00)的另外一种表示方法——“免费”。

接着,如果你询问手机是否附带充电器,那么你得到的答案只会是“是”或“否”。

同样,当在程序中表达某些值时,根据将对这些值进行的操作,你可以为这些值选择不同的表示方法。

在编程术语中,对值的不同表示方法称为类型。JavaScript为以下这些基本值提供了内置类型。

· 在计算时,你需要的是一个数字(number)。

· 在屏幕上打印一个值时,你需要的是一个字符串(string,一个或多个字符、单词或句子)。

· 在程序中作出决策时,你需要的是一个布尔值(boolean, true或者false)。

直接包含在源码中的值被称为字面值。字符串字面值由双引号("...")或单引号('…')围住,二者的唯一区别只是风格不同。数字和布尔型字面值可以直接表示(如42、true等)。

考虑:

        "I am a string";
        'I am also a string';


        42;


        true;
        false;

除了字符串/数字/布尔值类型,编程语言通常还会提供数组对象函数等。我们将在本章和下一章中更深入地介绍值和类型。

类型转换

如果需要在屏幕上打印出一个数字,那么就需要将这个值转化为字符串,在JavaScript中,这种转化称为“类型转换”。类似地,如果向电子商务网页的表单中输入一系列数字字符,那么这都是字符串,但如果需要使用这些值进行数学计算,则需要将其转换为数字。

JavaScript为类型间的强制转换提供了几种不同的机制。举例来说:

        var a = "42";
        var b = Number(a);


        console.log( a );     // "42"
        console.log( b );     // 42

如上所示,Number(..)(一个内置函数)的使用是一种显式的类型转换,可以将任意类型转换为数字类型。这应该是很直观的。

但是,如果需要进行比较的是不同类型的两个值,那么会怎么样呢?这就是一个很有争议的问题了,需要隐式的类型转换。

如果要比较字符串"99.99"和数字99.99,多数人会认为它们是相等的,但它们其实并不完全相同,难道不是吗?它们是两种表示方法下的同一个值,属于两种不同的类型。你可以说它们是“粗略相等”,是这样吗?

为了帮助你处理这些常见的情形,JavaScript有时会隐式地将值转换到匹配的类型。

因此,如果你使用==粗略相等运算符来判断"99.99" == 99.99是否成立,JavaScript会将左边的"99.99"转换为等价的数字类型99.99。这时比较就变成了99.99 == 99.99,当然为true了。

尽管隐式类型转换的设计意图是为了提供便利,但如果你没有花时间学习其行为方式的规则的话,它也可能会产生误导。而多数JavaScript开发者从来没有花时间来学习这一知识,所以他们普遍感觉隐式类型转换令人迷惑,并且会让程序产生出乎意料的bug。他们认为应该尽量避免隐式类型转换。隐式类型转换甚至被称为是语言设计中的缺陷。

然而,隐式类型转换是可以学习的机制,任何想要严肃对待JavaScript编程的人都应该学习。不仅仅是因为一旦掌握了其规则,就不会再被它迷惑,实际上这也可以提高你的程序质量!所以为此付出努力是十分值得的。

有关类型转换的更多信息,参见下一章和本系列《你不知道的JavaScript(中卷)》注2:此书已由人民邮电出版社出版。——编者注第一部分中的第4章。