编程世界里只存在两种基本元素,一个是数据,一个是代码。
要理解 JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。前面说过,编程世界只
有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript 就是把数据和代码都简化
到最原始的程度。
JavaScript 中的数据很简洁的。简单数据只有#ff0000, null, boolean, number 和string 这五种,
而复杂数据只有一种,即object。这就好比中国古典的朴素唯物思想,把世界最基本的元素归为金木水火
土,其他复杂的物质都是由这五种基本元素组成。
JavaScript 中的代码只体现为一种形式,就是function。
注意:以上单词都是小写的,不要和Number, String, Object, Function 等JavaScript 内置函数
混淆了。要知道,JavaScript 语言是区分大小写的呀!
任何一个 JavaScript 的标识、常量、变量和参数都只是unfined, null, bool, number, string, o
bject 和 function 类型中的一种,也就typeof 返回值表明的类型。除此之外没有其他类型了。
先说说简单数据类型吧。
undefined: 代表一切未知的事物,啥都没有,无法想象,代码也就更无法去处理了。
注意:typeof(undefined) 返回也是 undefined。
可以将undefined 赋值给任何变量或属性,但并不意味了清除了该变量,反而会
因此多了一个属性。
null: 有那么一个概念,但没有东西。无中似有,有中还无。虽难以想象,但已经可以用代码
来处理了。
注意:typeof(null)返回object,但null 并非object,具有null 值的变量也并非obj
ect。
boolean: 是就是,非就非,没有疑义。对就对,错就错,绝对明确。既能被代码处理,也可以控
制代码的流程。
number: 线性的事物,大小和次序分明,多而不乱。便于代码进行批量处理,也控制代码的迭代
和循环等。
注意:typeof(NaN)和typeof(Infinity)都返回number 。
NaN 参与任何数值计算的结构都是NaN,而且 NaN != NaN 。
Infinity / Infinity = NaN 。
string: 面向人类的理性事物,而不是机器信号。人机信息沟通,代码据此理解人的意图等等,
都靠它了。
简单类型都不是对象,JavaScript 没有将对象化的能力赋予这些简单类型。直接被赋予简单类型常量
值的标识符、变量和参数都不是一个对象。
所谓“对象化”,就是可以将数据和代码组织成复杂结构的能力。
JavaScript 中只有object 类型和function 类型提供了对象化的能力。
没有类
object 就是对象的类型。在JavaScript 中不管多么复杂的数据和代码,都可以组织成object 形式的
对象。
但 JavaScript 却没有 “类”的概念!
对于许多面向对象的程序员来说,这恐怕是JavaScript 中最难以理解的地方。是啊,几乎任何讲面向
对象的书中,第一个要讲的就是“类”的概念,这可是面向对象的支柱。这突然没有了“类”,我们就象一下
子没了精神支柱,感到六神无主。看来,要放下对象和类,达到“对象本无根,类型亦无形”的境界确实是
件不容易的事情啊。
先来看一段JavaScript 程序:
var life = {}; for(life.age = 1; life.age <= 3; life.age++) { switch(life.age) { case 1: life.body = "卵细胞"; life.say = function(){alert(this.age+this.body)}; break; case 2: life.tail = "尾巴"; life.gill = "腮"; life.body = "蝌蚪"; life.say = function(){alert(this.age+this.body+"-"+this.tail+","+this. gill)}; break; case 3: delete life.tail; delete life.gill; life.legs = "四条腿"; life.lung = "肺"; life.body = "青蛙"; life.say = function(){alert(this.age+this.body+"-"+this.legs+","+thi s.lung)}; break; 5 }; life.say(); };
这段 JavaScript 程序一开始产生了一个生命对象life,life 诞生时只是一个光溜溜的对象,没有任何
属性和方法。在第一次生命过程中,它有了一个身体属性body,并有了一个say 方法,看起来是一个“卵
细胞”。在第二次生命过程中,它又长出了“尾巴”和“腮”,有了tail 和gill 属性,显然它是一个“蝌蚪”。在
第三次生命过程中,它的tail 和gill 属性消失了,但又长出了“四条腿”和“肺”,有了legs 和lung 属性,
从而最终变成了“青蛙”。如果,你的想像力丰富的话,或许还能让它变成英俊的“王子”,娶个美丽的“公主”
什么的。不过,在看完这段程序之后,请你思考一个问题:
我们一定需要类吗?
还记得儿时那个“小蝌蚪找妈妈”的童话吗?也许就在昨天晚,你的孩子刚好是在这个美丽的童话中进入
梦乡的吧。可爱的小蝌蚪也就是在其自身类型不断演化过程中,逐渐变成了和妈妈一样的“类”,从而找到
了自己的妈妈。这个童话故事中蕴含的编程哲理就是:对象的“类”是从无到有,又不断演化,最终又消失
于无形之中的...
“类”,的确可以帮助我们理解复杂的现实世界,这纷乱的现实世界也的确需要进行分类。但如果我们的
思想被“类”束缚住了,“类”也就变成了“累”。想象一下,如果一个生命对象开始的时就被规定了固定的“类”,
那么它还能演化吗?蝌蚪还能变成青蛙吗?还可以给孩子们讲小蝌蚪找妈妈的故事吗?
所以,JavaScript 中没有“类”,类已化于无形,与对象融为一体。正是由于放下了“类”这个概念,Ja
vaScript 的对象才有了其他编程语言所没有的活力。
如果,此时你的内心深处开始有所感悟,那么你已经逐渐开始理解JavaScript 的禅机了。