《JavaScript语言精粹》—— 读书总结
话说这本书还是同学的推荐才读的,之前感觉这本书太薄了,不值得看,没想到小身材有大智慧,书中的内容总结的还是很到位的!所以就把最后几章,精华的部分整理整理。
优美的特性
函数是顶级对象
在JS中,没有块级作用域,都是以函数为最小的作用域,这样就可以把所有的变量放在函数的顶级声明。同时,也需要注意for循环,与java的使用方法就不一样了。即便是在for循环的体内,或者if语句中,声明的变量也是函数级别的。
而函数会延长作用域的范围,也就衍生出闭包这种概念,详细的还应该去参考《JS高级程序设计》,那里面讲的比较详细。
基于原型继承的动态对象
JS中没有像java一样的面向对象,但是可以通过prototype进行继承,不过直接使用prototype,会导致所有的派生对象都共同使用prototype的属性或者方法。因此在写面向对象的代码时,要注意此类问题。
毒瘤
全局变量
在JS中有三种声明变量的方式:
第一种,使用var语句声明:
var foo = value;
第二种,直接给全局对象添加属性
window.foo = value;
第三种,直接使用未声明的变量
foo = value;
自动插入分号
有时候js会自动为我们加入分号,比如:
return
{
status:true
};
有可能被解析成这样:
return ;
{
status : true
};
因此应该保持这种风格:
return {
status:true
};
typeof并不是万能的
检测null,最好的方法
value === null
伪数组
js没有真正的数组,因此不会越界出错。但是检测的时候有些麻烦,最可靠的办法是:
if(Object.prototype.toString.apply(my_value) === '[object Array]'){}
假值
Number : 0 NaN
String : ''
Boolean: false
Object : null
Undefined : undefined
糟粕
==
和!=经常会出现强制转换,再进行比较。因此为了避免出错,比较值时,应该使用=和!==
with
with语句的结果有时,很难预料。
eval
无论是性能,还是处于安全,都不推荐使用
continue
如果去掉它,会发现性能有所提升
switch
case条件可能不会跳出,而继续执行。
缺少块
if(ok)
test1();
test2();
这种代码有时是因为粗心,有时会给别人带来困惑。不知道是想要执行test1(),还是两个都执行。
位运算符
在javascript中,由于并不是像c或者java能接触机器底层,因此位运算也就没有那么高效了。
new
在new的时候,是创建一个继承于运算符后卖弄的对象,然后调用该运算符,把新对象绑定给this。但是如果忘记加new,则会把this绑定到全局对象中,造成污染。