频道栏目
读书频道 > web开发 > Javascript > JavaScript编程精解(原书第2版)
1.7 自动类型转换
2015-12-03 16:17:17     我来说两句
收藏   我要投稿
《高级程序设计(第3版)》是 超级畅销书的**新版。ECMAScript 5 和HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为 增添了很多适应未来发展的新特性。本书这一版除增加5 章  立即去当当网订购

在本书的开篇,我曾提到JavaScript可以处理任何程序,即便程序的行为让人难以捉摸。我们可以通过以下表达式来看出这一点:


 

当运算符作用在错误类型的值上时,JavaScript会自动将其转换成自己期望的类型,但是其规则却时常违背我们设计代码的初衷。这种操作称为强制类型转换。因此,第一个表达式中的null变成了0,而第二个表达式中的“5”则变成了5(将字符串转换成数字)。在第三个表达式中,“+”运算符尝试进行字符串拼接而非数字加法,因此将1转换成了“1”(将数字转换成字符串)。

当有些值无法显式地转换成数字(比如说“five”或undefined),就会产生NaN。而包含NaN的运算结果仍然是NaN,所以当你意外地发现获得了NaN结果,请检查一下是否发生了错误的类型转换。

当相同类型的值之间使用“==”符号进行比较时,其运算结果很好预测:除了NaN这种情况,只要两个值相同,则返回true。但如果类型不同,JavaScript则会使用一套复杂难懂的规则来确定输出结果。在绝大多数情况下,JavaScript只是将其中一个值转换成另一个值的类型。但如果运算符两侧存在null或undefined,那么只有两侧均为null或undefined时结果才为true。


 

上文提及的最后一点其实非常有用。当我们想确定一个值是否为真,而非null或undefined时,直接使用“==”(或“!=”)运算符来进行比较即可。

但当你想要测试一个值是否严格等于false时会发生什么呢?字符串与数字的布尔类型转换规则是:JavaScript会将0、NaN和空字符串("")视为false,其他值视为true。因此,诸如0 == false和"" == false之类的表达式都是true。在这种情况下,如果我们不希望在比较的时候进行任何自动类型转换,可以使用另外两个运算符:===和!==。第一个运算符用于检测两个值是否严格相等,第二个运算符用于测试是否严格不等。所以"" === false的结果是false,正如我们预期。

我建议使用三字符比较运算符来防止意外类型转换的发生,避免作茧自缚。但如果比较运算符两侧的值类型是相同的,那么使用较短的运算符也没有问题。

逻辑运算符的短路特性

逻辑运算符&&和||可以使用一种特殊方式来处理不同类型的值。这两个运算符会将左侧的值转换成布尔类型,以决定如何进行后续操作,但返回左侧值还是返回右侧值,则取决于运算符和左侧转换结果。

举例来说,当左侧值可以被转换成true时,||运算符会直接返回左侧的值,否则会返回右侧的值。当你希望以布尔值的方式来处理其他类型的值时,这种转换就派上用场了。


 

||运算符的这种功能可用于返回默认值。如果左侧表达式可能产生空值,那么右侧的表达式可以在左侧表达式为空时作为替代。

&&运算符工作方式与其相似但不相同。当左侧的值可以被转换成false时,&&运算符会返回左侧值,否则返回右侧值。

这两种运算符的另一个重要特性是:只有必要时才会计算右侧的表达式。以true || X为例,无论X是什么,即使X会进行一些可怕操作,其结果都是true,而且永远都不会计算X。false && X这种情况也是一样,只要左侧是false,X就会被忽略。这被称为短路计算。

条件运算符也会以类似方式工作。第一个表达式总会被计算,但第二个或第三个表达式只有在被选择时才会被计算。