JavaScript 小记

重学JavaScript, 点滴要点记下来:

 

只有 Function 对象有个 prototype 属性。

每个对象都有个隐藏的 prototype_imp指针(用户看不到), 当检索对象属性时,本对象找不到,就去prototype_imp里查找。
prototype_imp 不会用在更新操作中。这意味着 只能读取原型的属性,不能修改,修改操作会变成定义本对象的属性。

函数调用方式
成员调用 object.fun(params) 这时 this == object

函数调用  fun(params) 这是 this = GlobalObject

apply调用 fun.apply(a_that, params) 这时 this = a_taht

new 调用 new fun(param)  这是 this = 一个新对象, new_object.prototype_imp = fun.prototype; 返回值如果是个object 那么就返回object,如果是其它人就返回那个this对象
伪码 {
    var that = Object.beget(this.prototype);
        var other = this.apply(that, arguments);
        return (typeof other == 'object' && other) || that;
      }

函数生成
fun = new Function() 或 function fun (){} 会 fun.prototype = {constructor: fun};

隐式类型转换
Boolean true => 1, false => 0
String => Number
Object => String 或 => Number

相等判断 ==
null == undefined, NaN != NaN (NaN和任何东西都不相等)
Object 判断的是否引用相同对象

=== 先判断typeof 再判断值。


 

变量只支持函数级作用域,块不影响作用域( {var b=3} var a = b; 块内变量块外也可以使用)

for( index in object) index只能获得对象属性的索引的名字。 for( index in object) { use(object[index]);}

for( i in array) 只能检索数组对象的数值属性(下标可以是小数,例如 1.3)。(这是Array对象特殊的地方)


primitive type : number string object function


数组

array[index] 实现伪码:
 if( typeof index == 'objec') index = index.toString();
 int_index = new Number(index);
 if(isNaN(int_index) hash容器方式, 返回属性值

 else arrray方式,返回int_index对应的值。

 

 

 

所以数组的 整数下标,只是整数字符串的属性而已。 Array.prototype实现了一些成员函数而已。

 

可以把对象理解成hash容器,.访问只是个语法糖。

 

Simplified JavaScript

函数是有词法作用域的闭包。

对象是无类型的(duck type)

对象字面量 {}, 数组字面量[] 是 json的核心。

 

陷阱:

不要去使用全局变量,可以把整个程序裹在一个全局变量中。

 

javascript没有block作用域,所以需要在函数开头来声明变量,这样更安全和更容易理解。

 

 

javascript 会自动插入;来弥补错误。所以最好每个语句都有;

例如:

return 

{ status: ok}

会理解成

return undefined;

{status:ok}

写成

return {

                   status:ok

                 };

 就可以解决。

 

 Boolean

 false :   false, "", null, undefined, 0, NaN

 true :  String有值,Object有引用, 数值不是零和NaN

posted @ 2010-08-20 14:24  napoleon_liu  阅读(259)  评论(3编辑  收藏  举报