第一章:类型
大多数开发者会说,动态语言(就像 JS)没有 类型。让我们看看 ES5.1 语言规范(http://www.ecma-international.org/ecma-262/5.1/)在这个问题上是怎么说的:
在本语言规范中的算法所操作的每一个值都有一种关联的类型。可能的值的类型就是那些在本条款中定义的类型。类型还进一步被分为 ECMAScript 语言类型和语言规范类型
一个 ECMAScript 语言类型对应于 ECMAScript 程序员使用 ECMAScript 语言直接操作的值。ECMAScript 语言类型有 Undefined,Null,Boolean,String,Number,和 Object。
现在,如果你是一个强类型(静态类型的)语言的爱好者,你可能会反对“类型”一词的用法。在那些语言中,“类型”的含义要比它在 JS 这里的含义丰富得 多。
有些人说 JS 不应该声称拥有“类型”,它们应被称为“标签”或者“子类型”。
去他的!我们将使用这个粗糙的定义(看起来和语言规范的定义相同,只是改变了措辞):一个 类型 是一组固有的,内建的性质,对于引擎 和开发者 来说,它独一无二地标识了一个特定的值的行为,并将它与其他值区分开。
换句话说,如果引擎和开发者看待值 42
(数字)与看待值 "42"
(字符串)的方式不同,那么这两个值就拥有不同的 类型 — 分别是 number
和 string
。当你使用 42
时,你就在 试图 做一些数字的事情,比如计算。但当你使用 "42"
时,你就在 试图 做一些字符串的事情,比如输出到页面上,等等。这两个值有着不同的类型。
这绝不是一个完美的定义。但是对于这里的讨论足够好了。而且它与 JS 描述它的方式并不矛盾。