JavaScript 糟粕
最近经朋友推荐在阅读《JavaScript语言精粹》一书,阅读过后对作者的精辟理解我也是受益颇多,在此将作者在书后附录的JavaScript糟粕的一部分做一记录,也警示自己在今后的编程中去糟粕而引精华。
==运算符
JavaScript中有两组相等的运算符:===和!==、==和!=,两组运算符的区别在于===和!==只有两个运算数类型一直且拥有相等的值===才会返回true,!===返回fasle;而==和!=只有在两个运算数类型一致时才会做出正确判断,如果两个运算数为不同类型,他们则会试着去转换运算数的类型,以下的例子可以展现这一切:
'' == '0' //false
0 == '' //true
0 == '0' //true
false == 'false' //false
false == '0' //true
false == undefined //false
false == null //false
null == undefined //true
' \t\r\n' == 0 //true
以上例子如果使用 === 则结果全部都是 false ,因此在编程中尽量使用 === 以保证运算结果准确无误;
with 语句
JavaScript中的with语是用来快速访问对象的属性的,不幸的是他的结果可能有时不可预料,例如:
with(obj){
a==b;
}
和下面的代码等同
if(obj.a === undifinde){
a = obj.b ===undifinde ? b : obj.b
}else{
obj.a = obj.b === undifinde ? b : obj.b
}
所以,他等于以下语句中的某一条
a = b;
a = obj.b;
obj.a = b;
obj.a = obj .b;
这样就不能通过阅读代码知道他的下一步会是什么,也就无法确信他会正确的做你想做的事情;
eval
eval 方法的作用是传递一个字符串给编译器,并执行其结果,如果你只到点语法,而不知道下标语法,你就可能回这样写:
eval("myValue=myObject."+myKey+";");
而不是这样写:
myValue=myObject[myKey];
这样写会使代码可读性很差,并且影响代码性能,因为它需要编译器编译;
缺少块语句
JavaScript没有块及作用域,在分割代码时,一块代码会包裹在一对花括号中,但是在这对花括号在单行语句时是可以省略的;这往往会造成代码块分割不明确;例如:
if(ok)
t=true;
可能会变成:
if(ok)
t=true;
advance();
但是其本意却是
if(ok){
t=true;
};
advance();
所以制定严格的规范要求始终使用代码块会使代码可读性更强;
位运算符
JavaScript与Java有着相同的一套位运算符,在Java里位运算符处理整数类型,JavaScript中没有整数类型,只有双精度的浮点数类型,因此位操作符把他们的数字运算符转换为整数,接着进行计算,然后再转换回去,在大多数语言中,这些位运算接近于硬件处理,但JavaScript的运行环境一般接触不到硬件,所以非常慢,JavaScript很少被用来做位运算;
Function语句对比Function表达式
JavaScript既有Function语句,又有Function表达式,他们看起来好像是相同的;下面的语句意思相同
function foo(){ ... };
var foo = function(){ ... }
虽然两句意思一样,但是第二句更能明确的表达foo是一个包含一个函数值得变量,要用好这门语言,理解函数就是数值是很重要的;
function语句解析时会声明提前,并不符合先声明后引用的原则,这回造成程序很混乱。