1. ==程序員
Javascript有兩組相等運算符,一組是==和!=,另外一組是===和!==。前者只比較值的相等,後者除了值之外,還比較類型是否相同。ajax
請儘可能不要使用前一組,永遠只使用===和!==。由於==默認會進行類型轉換,規則十分難記。若是你不相信的話,請回答下面五個判斷式的值是true仍是false:編程
false == 'false'json
false == undefined安全
false == null編程語言
null == undefined函數式編程
0 == ''函數
前三個是false,後兩個是true。性能
2. with網站
with的本意是減小鍵盤輸入。好比
obj.a = obj.b;
obj.c = obj.d;
能夠簡寫成
with(obj) {
a = b;
c = d;
}
可是,在實際運行時,解釋器會首先判斷obj.b和obj.d是否存在,若是不存在的話,再判斷全局變量b和d是否存在。這樣就致使了低效率,並且可能會致使意外,所以最好不要使用with語句。
3. eval
eval用來直接執行一個字符串。這條語句也是不該該使用的,由於它有性能和安全性的問題,而且使得代碼更難閱讀。
eval可以作到的事情,不用它也能作到。好比
eval("myValue = myObject." + myKey + ";");
能夠直接寫成
myValue = myObject[myKey];
至於ajax操做返回的json字符串,可使用官方網站提供的解析器json_parse.js運行。
4. continue
這條命令的做用是返回到循環的頭部,可是循環原本就會返回到頭部。因此經過適當的構造,徹底能夠避免使用這條命令,使得效率獲得改善。
5. switch 貫穿
switch結構中的case語句,默認是順序執行,除非遇到break,return和throw。有的程序員喜歡利用這個特色,好比
switch(n) {
case 1:
case 2:
break;
}
這樣寫容易出錯,並且難以發現。所以建議避免switch貫穿,凡有case的地方,一概加上break。
switch(n) {
case 1:
break;
case 2:
break;
}
6. 單行的塊結構
if、while、do和for,都是塊結構語句,可是也能夠接受單行命令。好比
if (ok) t = true;
甚至寫成
if (ok)
t = true;
這樣不利於閱讀代碼,並且未來添加語句時很是容易出錯。建議不論是否只有一行命令,都一概加上大括號。
if (ok){
t = true;
}
7. ++和--
遞增運算符++和遞減運算符--,直接來自C語言,表面上可讓代碼變得很緊湊,可是實際上會讓代碼看上去更復雜和更晦澀。所以爲了代碼的整潔性和易讀性,不用爲好。
8. 位運算符
Javascript徹底套用了Java的位運算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號的右移>>和用0補足的右移>>>。
這套運算符針對的是整數,因此對Javascript徹底無用,由於Javascript內部,全部數字都保存爲雙精度浮點數。若是使用它們的話,Javascript不得不將運算數先轉爲整數,而後再進行運算,這樣就下降了速度。並且"按位與運算符"&同"邏輯與運算符"&&,很容易混淆。
9. function語句
在Javascript中定義一個函數,有兩種寫法:
function foo() { }
和
var foo = function () { }
兩種寫法徹底等價。可是在解析的時候,前一種寫法會被解析器自動提高到代碼的頭部,所以違背了函數應該先定義後使用的要求,因此建議定義函數時,所有采用後一種寫法。
10. 基本數據類型的包裝對象
Javascript的基本數據類型包括字符串、數字、布爾值,它們都有對應的包裝對象String、Number和Boolean。因此,有人會這樣定義相關值:
new String("Hello World");
new Number(2000);
new Boolean(false);
這樣寫徹底沒有必要,並且很是費解,所以建議不要使用。
另外,new Object和new Array也不建議使用,能夠用{}和[]代替。
11. new語句
Javascript是世界上第一個被大量使用的支持Lambda函數的語言,本質上屬於與Lisp同類的函數式編程語言。可是當前世界,90%以上的程序員都是使用面向對象編程。爲了靠近主流,Javascript作出了妥協,採納了類的概念,容許根據類生成對象。
類是這樣定義的:
var Cat = function (name) {
this.name = name;
this.saying = 'meow' ;
}
而後,再生成一個對象
var myCat = new Cat('mimi');
這種利用函數生成類、利用new生成對象的語法,其實很是奇怪,一點都不符合直覺。並且,使用的時候,很容易忘記加上new,就會變成執行函數,而後莫名其妙多出幾個全局變量。因此,建議不要這樣建立對象,而採用一種變通方法。
Douglas Crockford給出了一個函數:
Object.beget = function (o) {
var F = function (o) {};
F.prototype = o ;
return new F;
};
建立對象時就利用這個函數,對原型對象進行操做:
var Cat = {
name:'',
saying:'meow'
};
var myCat = Object.beget(Cat);
對象生成後,能夠自行對相關屬性進行賦值:
myCat.name = 'mimi';
12. void
在大多數語言中,void都是一種類型,表示沒有值。可是在Javascript中,void是一個運算符,接受一個運算數,並返回undefined。
void 0; // undefined
這個命令沒什麼用,並且很使人困惑,建議避免使用。