悟透JavaScript
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1回归简单

要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript就是把数据和代码都简化到最原始的程度。

JavaScript中的数据是很简洁的。简单数据只有 undefined, null, boolean, number和string这五种,而复杂数据只有一种,即object。这就好比中国古典的朴素唯物思想,把世界最基本的元素归为金木水火土,其他复杂的物质都是由这5种基本元素组成的。

JavaScript中的代码只体现为一种形式,就是function。

注意:以上单词都是小写的,不要和Number, String, Object, Function等JavaScript内置函数混淆了。要知道,JavaScript语言是区分大小写的呀!

可以用typeof运算符来获取一个JavaScript元素的类型。由于typeof是运算符,因此可以有两用等价的写法:typeof X和typeof(X)。加不加括号无所谓,加了括号之后看起来似乎更习惯些。typeof运算之后得到的结果是一个string类型的值,也就是说:typeof 123的结果是“number”,typeof typeof 123的结果一定是“string”。

任何一个JavaScript的标识、常量、变量和参数都只是unfined, null, bool, number, string, object 和 function类型中的一种,也即typeof返回值表明的类型。除此之外没有其他类型了。

先说说简单数据类型吧。

undefined 代表一切未知的事物,啥都没有,无法想像,代码也就更无法去处理了。

注意:typeof(undefined) 返回的也是 undefined。

可以将undefined赋值给任何变量或属性,但并不意味清除了该变量,反而会因此多了一个属性。

null 有那么一个概念,但没有东西。无中似有,有中还无。虽难以想像,

但已经可以用代码来处理了。

注意:typeof(null)返回object,但null并非object,具有null值的变量也并非object。

boolean 是就是,非就非,没有疑义。对就对,错就错,绝对明确。既能被代码处理,也可以控制代码的流程。

Number 线性的事物,大小和次序分明,多而不乱,便于代码进行批量处理,也控制代码的迭代和循环等。

注意:typeof(NaN)和typeof(Infinity)都返回number。

NaN参与任何数值计算的结构都是NaN,而且 NaN != NaN。

Infinity / Infinity = NaN。

String 面向人类的理性事物,而不是机器信号。人机信息沟通、代码据此理解人的意图等功能,都靠它了。

为了进一步简化编程,JavaScript还在这些简单数据之上,再规定了一些特殊含义。这些特殊含义又可以使得JavaScript的语句写得更简洁。但是,这些特殊含义有时也会给我们设下难以琢磨的陷阱。

例如,undefined, null, “”, 0 这四个值转换为逻辑值时就是false,除这四个家伙再加上false本身之外,其他的任何东西(包括简单类型值、所有对象和函数)转换为逻辑值时都是true。有趣的是在undefined, null, “”, 0, false这五个家伙中,除undefined==null之外,它们却又互不相等。使用这些规定,我们可以编写更简洁的逻辑判断语句。

再如,完全由数字组成的字符串与该字符串表示的值是相等的。因此,“123”==123的值是true,这也为我们编写代码提供了方便。

但是,“0123” == 0123的值却是false!奇怪吗?因为JavaScript将“0”开头的整数常量当八进制数处理,所以后面的0123实际是八进制数,而“0123”是按十进制转换成数字值的,自然不会相等。这也常常给我们制造了非常奇怪的问题,当然不能怪JavaScript有问题,该反思的是自己的人品。

那么,我们不想让“123”==123该怎么办呢?这样,“123”===123就返回false了!

三个等号?

对!JavaScript里的三个等号“===”表示“全等”,也就是数据值与数据类型都必须相等才是true。因此,undefined==null是true,但undefined===null就是false。

当然,“!==”就是“不全等”了。注意,“不全等”与“全不等”是两个概念。”123”与123是“不全等”,但并非“全不等”!

“!==”这种“不全等”可以表示为这样的等价逻辑:

          A != B || typeof(A) != typeof(B)

而“全不等”必须是值不相等而且类型也不相等,应该是这样的逻辑:

          A != B && typeof(A) != typeof(B)

不过,在编程中基本遇不到“全不等”这样的判断,因此JavaScript也就没有专门的运算符了。

所有简单类型都不是对象,JavaScript没有将对象化的能力赋予这些简单类型。直接被赋予简单类型常量值的标识符、变量和参数都不是一个对象。

所谓“对象化”能力,就是可以将数据和代码组织成复杂结构的能力。JavaScript中只有object类型和function类型提供了对象化的能力。