《程序员》2008.09期有一篇名为《无废话ErLang》的文章,这让我想到了许多的诸如“无废话C”、“无
废话书评”这类的文章,也想到了JavaScript可没有一篇“无废话”,因此决定开个篇来写这个。与这个
决定相关的,索性,此次就写个最简单的吧。
声明一下:若是只想看复杂的东西,不要读这篇文章了。
1、JavaScript最初实际上是过程式的
追溯到1.0时代的JavaScript,实际上是过程式的。它的基本特性有只有两项,一项是可以直接放在网页的HTML
标签中去接管事件,例如:javascript
第二项则是支持一种简单的对象构造器(函数)。其实这个时代的构造器不如说是初始化函数更合适,它应当
这样写:html
因此,早期的JavaScript不容置疑地背上了“基于对象的过程式脚本语言”的名头,这一点也不冤枉。除了
上面两项特性,JavaScript有着一些通常性的脚本语言的性质,例如:
-整个.js文件一次性装载到执行环境(例如WEB浏览器)中,在经历一次语法分析以后,开始逐行执行;
-在上述语法分析周期,(具名的)函数和用"var"声明的变量被预先处理在一个标识符表中,以便脚本代码使用;
-从全局的代码行或函数调用开始执行,整个过程当中执行不到的代码不被查错(除第一步中的语法检错外)。
也具备一般的过程式语言的性质,例如:
-有if/for/while/switch等语句;
-用function来声明函数,使用"(..)"来声明它的形式参数表,以及表示函数调用和传参;
-相似于C语言的基本语法,包括使用"{..}"来表示代码块,以及使用"!="等运算符号;
-一个相似于Java语言的对象操做运算符"."号,和属性、方法这样的基本概念。
好了,如今你看到了一个基本的JavaScript语言,它的代码只有象C同样的函数与语句行,支持很是简单的面
向对象编程。OK,这其实也差很少是JavaScript的所有……嗯……所有的语法基础观念。若是你用过一门哪怕
稍稍入门一点的程序语言,你都会以为JavaScript其实挺简单的。
是啊,“写个函数,而后调用它”,就这么简单。例如:java
2、稍微复杂一点的是数据类型
JavaScript有六种基本数据类型,分为两类。一类是值类型,即undefined,string, number和boolean;一类
是引用类型,即function和object。检测数据X是何种类型,能够简单地使用"typeof X"来返回一个字符串。
值类型与引用类型在其它高级语言中,是用“访问过程当中是传值仍是传引用”来区别的。简单说,在下面函数
中:程序员
X传入的是值自己,仍是一个指向该值的引用(你能够想象成指针),代表了X是何种类型。与其它语言不一样的
是,JavaScript并不在调用入口上加指示字来讲明传值的方法,例如:正则表达式
而是简单的由脚本引擎根据实际传入的X的数据类型来决定如何传值。例如:编程
能这样处理的关键,在于JavaScript类型系统足够简洁。六种基本类型包括了三个哲学化的观念:能执行的
与不能执行的;对象或非对象;有(值)或无(值)。显然,理解这种哲学性的思想并不容易,由于更复杂一层
的、自包含的逻辑是:函数也是对象、值也是对象、无值也是值。
这就是JavaScript类型系统的所有了。若是你想简单的用用,那么你记住下面的就够了:
-string、number、boolean三种简单值类型是用来传给网页显示的;
-object用来存放其它的object、funtion或上述简单值类型,并用'.'运算经过一个属性名找到它们;
-undefined是用来检测数据有效无效的;
-function是用来执行的。
固然,若是你要成为思想家或者语言学的疯子,那么去思考上面的哲学化命题吧,我不拦着你。
3、能用鼻子想通的就是直接量了
或许不少人都搞不明白JavaScript中的直接量声明,然而它确实是很是简单的。既然咱们大多数高级语言都
支持常量声明,甚至最原始的汇编语言也支持当即值——例如:数组
那么JavaScript固然……必然……能够面无愧色地支持直接量了——他们实际上是一个概念。例如:浏览器
只不过在理解的时候,必定要切记:全部上述的代码中,所谓直接量或当即值,是指那个'256',而不是那
个变量或常量的标识符ABYTE/aByte。更进一步的,你要知道JavaScript支持了8种直接量声明:
--------------------
数值:支持整数,浮点和0x等进制前缀,以及……等等;
布尔值:true/false;
无值:undefined;
函数:function() { ... },也称为匿名函数;
字符串:使用'..'或"..",支持多行和转义符;
正则表达式:使用/../..,支持g,i,m等正则配置;
数组:使用[..],支持嵌套数组;
对象:使用{...},支持嵌套对象声明;
--------------------
你能够把上述字符量做为一个个体,用在代码——个人意思是表达式或语句行——的任意位置。用鼻子就能够
进行的推论是:函数
如上的,你能够把全部的直接量放在表达式或语句中间。偶尔的,由于语法解析的必要,你可能须要用一对
括号把这个直接量括起来——不然语法上会出现歧义,例以下面这个:this
好了,直接量本来就这么简单,你只须要指望本身还有一个没退化的鼻子就行了。
4、原型继承
原型继承多是这个世界上最简单不过的东西了。
咱们假定一个对象是一张表——伟大的Anders就支持我这个假设,他说JavaScript的对象是“属性包”——
这样的一个表中存放的就是“name=value”这样的“名字/值”对。当咱们想用下面的代码:
去找值(value)时,就在表里查一下(用delphi的人应该记得TStringList吧)。对象,哦,所谓对象——在
我曾经的理解里——就是“带有继承关系的结构体(struct/record)”。那么,继承关系是?
是这样,若是上面的查找不成功,对于原型继承来讲,只须要在aObj这个对象的“原型”中找一下,就成了。
这个原型也是一个对象,记录在构造器函数的prototype属性中。例如:
当在aObj中找不到name这个属性时,按照上面的规则,就会去xxx这个对象中找,也就是试图找找"xxx.name"。
因为xxx自己也是一个对象,也会有一个构造器函数(例如xxxObject()),所以当xxx.name也找不到时,就会
去xxxObject.prototype里面去找……如此……如此深层次的挖掘,直到再也找不到……就返回undefined。
多简单啊,所谓原型继承,只不过是一个简单的检索规则。
反过来讲,你须要让aObj能访问到某个成员,也只须要修改一下它(或它们——一指相似aObj的实例)的原型
就行了。这在JavaScript中是很是经常使用的。例如你想让全部的string都有某个属性:
又例如你想让全部的对象都有某个属性(或方法,或其它什么东东),那么:
多么美好,如今String也能getMyName了,函数也能getMyName了,全部没有名字的也有名字了——固然,名字是undefined。没名字也是名字,我没想过你会不会变成哲学疯子,对不起。