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
数组
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