JS重修札记

1.javascript 现在泛指按照 ECMAscript Edtion 3 实现的语言。spiderMonkey是 javascript在Mozilla开源项目中的名称。

2.javascript的执行分为“语法分析期”和“运行期”。有些看起来正确的代码却不能通过语法分析。如

function test(){
    //code here
}();

3."var x=3"中的"="是语法分隔符,具有二义性。这一点还是需要将javascript执行分为两个时期来理解。

4.两个引用之间如果等值(==),则一定全等(===)。

5.“表达式”、“语句”、“表达式语句”是三个容易模糊的概念。

6.javascript中任何语句和表达式都有返回值,这对某些优雅的写法起到了重要影响。

7.逻辑运算符"||"和"&&"返回的是运算元而不是bool值。

8.比较运算符,对于“非字符串”时,先自动转化成数字再比较。

9.运算符中的void ,  ? :  ,  () , "," 是作用于表达式的。优先级各有不同。

10.javascript的变量作用域是函数级的,不是语句级的,所有声明在for(var i ...)的i,再外部也可用。

11.函数调用( functionName() )的functionName其实是运算元,()是运算符,称为强制运算符。

 

12.new 是运算符,使用" new comstructer()"这种形式来声明示例,内置原理并不是“产生示例,并调用构造函数”。而是“创建实例,实例传入constructor作为this指针。如果constructor有引用类型的返回值,则抛弃this,直接使用返回值作为实例。如果返回值为值类型,则抛弃返回值。仍然使用创建的实例”。以此为基础可以实现单利。

13.delete只能删除实例的属性,不能删除父类属性。如果实例与父类有重名属性,删除后实例将重新使用父类属性值。

14.因为1.3版本前没有实现"in"运算符,所以使用if(a.b)这种判断。现在应统一使用 in 进行判断。防止属性值为null或者其他特殊情况时判断出错。

13.[]具有“数组直接量”和“取对象属性”两种含义,组合使用会产生奇特效果,特比当同时使用“,”作为“语法分割符”和“连续运算符”时。如" [a,b,[a,c][1,2]] "。

14.空对象(null)是属于对象类型,但是没有属性,不是由object构造出来的。

15.空的对象({}),具有object原型一切属性。只是实例属性为空。

16.javascript中,对象实例没有原型(prototype),构造器(函数类型)才有原型,并且是当需要作为构造器使用时,才产生原型。该原型是一个标准的object构造器的实例,不过该实例的constructor属性被自动赋值为当前函数。

17.原型也是一个对象实例,这是“原型继承体系”与“类继承体系”的不同。类继承体系中,类不需要是“对象”。

18.javascript的实例创建机制是“对原型属性进行写时复制”。

19.proto是对象实例的不可见属性,指向产生实例的原型。

20.使用原型继承时,如果需要回溯,需要通过constructor修正原型链。

 

21.javascript是惰性求值的,也就是传入的参数不管要不要用,都会对它求值。

22.函数是第一型的意思是,函数是“第一类数据类型”。“第一类”强调的是“不可分解的,最高级别的,不被重述的”。

23.javascript中的第一型有六种:undefined  string  boolean  number function object.

24.“闭包”是函数在执行期的一个动态概念。包括“函数实例的环境、引用、以及由upvalue组成的数组”。

25.一份函数代码可以有多个实例,一个函数实例可以有多个引用。

26.函数产生实例通常是将函数赋值到一个新对象的属性时(通过原型继承来的不会产生实例)。

27.对象属性与变量没有本质差别;全局变量实际上是全局对象的属性;局部变量实际上是“调用对象”的属性。

28.“调用对象”是内部数据结构,是闭包的相关元素。

29.闭包与函数实例的生存周期是分开管理的。函数被调用时,总是初始化一个闭包。上次的闭包是否销毁。取决于闭包中是否有被其他闭包引用的变量。

30.形参与无值局部变量重复时,取形参,否则取局部变量。

31.构造器的原型创建自系统内部的对象系统,不是可被外部覆盖的标示符。

 

32.javascript中存在两套对象系统,一套是元类型系统(第一型),包括六种;另一套是对象类型系统,是object的分支。javascript通过包装类将两者统一。

33.关联数组是对象系统的基础。

 

34. new运算符后跟一个对象会报错,即使给这个对象指定prototype属性以及它的constructor。说明new运算符是根据后面的类型来判断的。并且是执行期报错。

 

补充:

35."="赋值表达式返回的也是右边的运算元。

36.使用new产生的实例,只继承从prototype得来的属性,并且不同实例的属性指向同一个引用。只有constuctor里面对this属性进行赋值,才能产生不同实例的属性不指向同一个引用。在函数外对函数增加的属性,不会被继承到实例里。

37.函数实例和“由函数作为constructor产生的对象实例”是不同概念。

 

posted @ 2012-05-22 10:13  侯振宇  阅读(541)  评论(7编辑  收藏  举报