12種不宜使用的Javascript語(yǔ)法整理
更新時(shí)間:2013年11月04日 17:39:17 作者:
Javascript語(yǔ)法,初學(xué)js的朋友都應(yīng)該知道,下面整理了12種不宜使用的js語(yǔ)法,感興趣的朋友可以參考下
1.==
Javascript有兩組相等運(yùn)算符,一組是==和!=,另一組是===和!==。前者只比較值的相等,后者除了值以外,還比較類型是否相同。
請(qǐng)盡量不要使用前一組,永遠(yuǎn)只使用===和!==。因?yàn)?=默認(rèn)會(huì)進(jìn)行類型轉(zhuǎn)換,規(guī)則十分難記。如果你不相信的話,請(qǐng)回答下面五個(gè)判斷式的值是true還是false:
false == 'false'
false == undefined
false == null
null == undefined
0 == ''
前三個(gè)是false,后兩個(gè)是true。
2.with
with的本意是減少鍵盤輸入。比如
obj.a = obj.b;
obj.c = obj.d;
可以簡(jiǎn)寫成
with(obj) {
a = b;
c = d;
}
但是,在實(shí)際運(yùn)行時(shí),解釋器會(huì)首先判斷obj.b和obj.d是否存在,如果不存在的話,再判斷全局變量b和d是否存在。這樣就導(dǎo)致了低效率,而且可能會(huì)導(dǎo)致意外,因此最好不要使用with語(yǔ)句。
3.eval
eval用來(lái)直接執(zhí)行一個(gè)字符串。這條語(yǔ)句也是不應(yīng)該使用的,因?yàn)樗行阅芎桶踩缘膯?wèn)題,并且使得代碼更難閱讀。
eval能夠做到的事情,不用它也能做到。比如
eval("myValue = myObject." + myKey + ";");
可以直接寫成
myValue = myObject[myKey];
至于ajax操作返回的json字符串,可以使用官方網(wǎng)站提供的解析器json_parse.js運(yùn)行。
4.continue
這條命令的作用是返回到循環(huán)的頭部,但是循環(huán)本來(lái)就會(huì)返回到頭部。所以通過(guò)適當(dāng)?shù)臉?gòu)造,完全可以避免使用這條命令,使得效率得到改善。
5.switch 貫穿
switch結(jié)構(gòu)中的case語(yǔ)句,默認(rèn)是順序執(zhí)行,除非遇到break,return和throw。有的程序員喜歡利用這個(gè)特點(diǎn),比如
switch(n) {
case 1:
case 2:
break;
}
這樣寫容易出錯(cuò),而且難以發(fā)現(xiàn)。因此建議避免switch貫穿,凡是有case的地方,一律加上break。
switch(n) {
case 1:
break;
case 2:
break;
}
6.單行的塊結(jié)構(gòu)
if、while、do和for,都是塊結(jié)構(gòu)語(yǔ)句,但是也可以接受單行命令。比如
if (ok) t = true;
甚至寫成
if (ok)
t = true;
這樣不利于閱讀代碼,而且將來(lái)添加語(yǔ)句時(shí)非常容易出錯(cuò)。建議不管是否只有一行命令,都一律加上大括號(hào)。
if (ok){
t = true;
}
7.++和--
遞增運(yùn)算符++和遞減運(yùn)算符--,直接來(lái)自C語(yǔ)言,表面上可以讓代碼變得很緊湊,但是實(shí)際上會(huì)讓代碼看上去更復(fù)雜和更晦澀。因此為了代碼的整潔性和易讀性,不用為好。
8.位運(yùn)算符
Javascript完全套用了Java的位運(yùn)算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號(hào)的右移>>和用0補(bǔ)足的右移>>>。
這套運(yùn)算符針對(duì)的是整數(shù),所以對(duì)Javascript完全無(wú)用,因?yàn)镴avascript內(nèi)部,所有數(shù)字都保存為雙精度浮點(diǎn)數(shù)。如果使用它們的話,Javascript不得不將運(yùn)算數(shù)先轉(zhuǎn)為整數(shù),然后再進(jìn)行運(yùn)算,這樣就降低了速度。而且“按位與運(yùn)算符”&同“邏輯與運(yùn)算符”&&,很容易混淆。
9.function語(yǔ)句
在Javascript中定義一個(gè)函數(shù),有兩種寫法:
function foo() { }
和
var foo = function () { }
兩種寫法完全等價(jià)。但是在解析的時(shí)候,前一種寫法會(huì)被解析器自動(dòng)提升到代碼的頭部,因此違背了函數(shù)應(yīng)該先定義后使用的要求,所以建議定義函數(shù)時(shí),全部采用后一種寫法。
10.基本數(shù)據(jù)類型的包裝對(duì)象
Javascript的基本數(shù)據(jù)類型包括字符串、數(shù)字、布爾值,它們都有對(duì)應(yīng)的包裝對(duì)象String、Number和Boolean。所以,有人會(huì)這樣定義相關(guān)值:
new String("Hello World");
new Number(2000);
new Boolean(false);
這樣寫完全沒(méi)有必要,而且非常費(fèi)解,因此建議不要使用。
另外,new Object和new Array也不建議使用,可以用{}和[]代替。
11.new語(yǔ)句
Javascript是世界上第一個(gè)被大量使用的支持Lambda函數(shù)的語(yǔ)言,本質(zhì)上屬于與Lisp同類的函數(shù)式編程語(yǔ)言。但是當(dāng)前世界,90%以上的程序員都是使用面向?qū)ο缶幊?。為了靠近主流,Javascript做出了妥協(xié),采納了類的概念,允許根據(jù)類生成對(duì)象。
類是這樣定義的:
var Cat = function (name) {
this.name = name;
this.saying = 'meow' ;
}
然后,再生成一個(gè)對(duì)象
var myCat = new Cat('mimi');
這種利用函數(shù)生成類、利用new生成對(duì)象的語(yǔ)法,其實(shí)非常奇怪,一點(diǎn)都不符合直覺(jué)。而且,使用的時(shí)候,很容易忘記加上new,就會(huì)變成執(zhí)行函數(shù),然后莫名其妙多出幾個(gè)全局變量。所以,建議不要這樣創(chuàng)建對(duì)象,而采用一種變通方法。
Douglas Crockford給出了一個(gè)函數(shù):
Object.beget = function (o) {
var F = function (o) {};
F.prototype = o ;
return new F;
};
創(chuàng)建對(duì)象時(shí)就利用這個(gè)函數(shù),對(duì)原型對(duì)象進(jìn)行操作:
var Cat = {
name:'',
saying:'meow'
};
var myCat = Object.beget(Cat);
對(duì)象生成后,可以自行對(duì)相關(guān)屬性進(jìn)行賦值:
myCat.name = 'mimi';
12.void
在大多數(shù)語(yǔ)言中,void都是一種類型,表示沒(méi)有值。但是在Javascript中,void是一個(gè)運(yùn)算符,接受一個(gè)運(yùn)算數(shù),并返回undefined。
void 0; // undefined
這個(gè)命令沒(méi)什么用,而且很令人困惑,建議避免使用。
Javascript有兩組相等運(yùn)算符,一組是==和!=,另一組是===和!==。前者只比較值的相等,后者除了值以外,還比較類型是否相同。
請(qǐng)盡量不要使用前一組,永遠(yuǎn)只使用===和!==。因?yàn)?=默認(rèn)會(huì)進(jìn)行類型轉(zhuǎn)換,規(guī)則十分難記。如果你不相信的話,請(qǐng)回答下面五個(gè)判斷式的值是true還是false:
false == 'false'
false == undefined
false == null
null == undefined
0 == ''
前三個(gè)是false,后兩個(gè)是true。
2.with
with的本意是減少鍵盤輸入。比如
obj.a = obj.b;
obj.c = obj.d;
可以簡(jiǎn)寫成
復(fù)制代碼 代碼如下:
with(obj) {
a = b;
c = d;
}
但是,在實(shí)際運(yùn)行時(shí),解釋器會(huì)首先判斷obj.b和obj.d是否存在,如果不存在的話,再判斷全局變量b和d是否存在。這樣就導(dǎo)致了低效率,而且可能會(huì)導(dǎo)致意外,因此最好不要使用with語(yǔ)句。
3.eval
eval用來(lái)直接執(zhí)行一個(gè)字符串。這條語(yǔ)句也是不應(yīng)該使用的,因?yàn)樗行阅芎桶踩缘膯?wèn)題,并且使得代碼更難閱讀。
eval能夠做到的事情,不用它也能做到。比如
eval("myValue = myObject." + myKey + ";");
可以直接寫成
myValue = myObject[myKey];
至于ajax操作返回的json字符串,可以使用官方網(wǎng)站提供的解析器json_parse.js運(yùn)行。
4.continue
這條命令的作用是返回到循環(huán)的頭部,但是循環(huán)本來(lái)就會(huì)返回到頭部。所以通過(guò)適當(dāng)?shù)臉?gòu)造,完全可以避免使用這條命令,使得效率得到改善。
5.switch 貫穿
switch結(jié)構(gòu)中的case語(yǔ)句,默認(rèn)是順序執(zhí)行,除非遇到break,return和throw。有的程序員喜歡利用這個(gè)特點(diǎn),比如
復(fù)制代碼 代碼如下:
switch(n) {
case 1:
case 2:
break;
}
這樣寫容易出錯(cuò),而且難以發(fā)現(xiàn)。因此建議避免switch貫穿,凡是有case的地方,一律加上break。
復(fù)制代碼 代碼如下:
switch(n) {
case 1:
break;
case 2:
break;
}
6.單行的塊結(jié)構(gòu)
if、while、do和for,都是塊結(jié)構(gòu)語(yǔ)句,但是也可以接受單行命令。比如
if (ok) t = true;
甚至寫成
if (ok)
t = true;
這樣不利于閱讀代碼,而且將來(lái)添加語(yǔ)句時(shí)非常容易出錯(cuò)。建議不管是否只有一行命令,都一律加上大括號(hào)。
if (ok){
t = true;
}
7.++和--
遞增運(yùn)算符++和遞減運(yùn)算符--,直接來(lái)自C語(yǔ)言,表面上可以讓代碼變得很緊湊,但是實(shí)際上會(huì)讓代碼看上去更復(fù)雜和更晦澀。因此為了代碼的整潔性和易讀性,不用為好。
8.位運(yùn)算符
Javascript完全套用了Java的位運(yùn)算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號(hào)的右移>>和用0補(bǔ)足的右移>>>。
這套運(yùn)算符針對(duì)的是整數(shù),所以對(duì)Javascript完全無(wú)用,因?yàn)镴avascript內(nèi)部,所有數(shù)字都保存為雙精度浮點(diǎn)數(shù)。如果使用它們的話,Javascript不得不將運(yùn)算數(shù)先轉(zhuǎn)為整數(shù),然后再進(jìn)行運(yùn)算,這樣就降低了速度。而且“按位與運(yùn)算符”&同“邏輯與運(yùn)算符”&&,很容易混淆。
9.function語(yǔ)句
在Javascript中定義一個(gè)函數(shù),有兩種寫法:
function foo() { }
和
var foo = function () { }
兩種寫法完全等價(jià)。但是在解析的時(shí)候,前一種寫法會(huì)被解析器自動(dòng)提升到代碼的頭部,因此違背了函數(shù)應(yīng)該先定義后使用的要求,所以建議定義函數(shù)時(shí),全部采用后一種寫法。
10.基本數(shù)據(jù)類型的包裝對(duì)象
Javascript的基本數(shù)據(jù)類型包括字符串、數(shù)字、布爾值,它們都有對(duì)應(yīng)的包裝對(duì)象String、Number和Boolean。所以,有人會(huì)這樣定義相關(guān)值:
復(fù)制代碼 代碼如下:
new String("Hello World");
new Number(2000);
new Boolean(false);
這樣寫完全沒(méi)有必要,而且非常費(fèi)解,因此建議不要使用。
另外,new Object和new Array也不建議使用,可以用{}和[]代替。
11.new語(yǔ)句
Javascript是世界上第一個(gè)被大量使用的支持Lambda函數(shù)的語(yǔ)言,本質(zhì)上屬于與Lisp同類的函數(shù)式編程語(yǔ)言。但是當(dāng)前世界,90%以上的程序員都是使用面向?qū)ο缶幊?。為了靠近主流,Javascript做出了妥協(xié),采納了類的概念,允許根據(jù)類生成對(duì)象。
類是這樣定義的:
復(fù)制代碼 代碼如下:
var Cat = function (name) {
this.name = name;
this.saying = 'meow' ;
}
然后,再生成一個(gè)對(duì)象
var myCat = new Cat('mimi');
這種利用函數(shù)生成類、利用new生成對(duì)象的語(yǔ)法,其實(shí)非常奇怪,一點(diǎn)都不符合直覺(jué)。而且,使用的時(shí)候,很容易忘記加上new,就會(huì)變成執(zhí)行函數(shù),然后莫名其妙多出幾個(gè)全局變量。所以,建議不要這樣創(chuàng)建對(duì)象,而采用一種變通方法。
Douglas Crockford給出了一個(gè)函數(shù):
復(fù)制代碼 代碼如下:
Object.beget = function (o) {
var F = function (o) {};
F.prototype = o ;
return new F;
};
創(chuàng)建對(duì)象時(shí)就利用這個(gè)函數(shù),對(duì)原型對(duì)象進(jìn)行操作:
復(fù)制代碼 代碼如下:
var Cat = {
name:'',
saying:'meow'
};
var myCat = Object.beget(Cat);
對(duì)象生成后,可以自行對(duì)相關(guān)屬性進(jìn)行賦值:
myCat.name = 'mimi';
12.void
在大多數(shù)語(yǔ)言中,void都是一種類型,表示沒(méi)有值。但是在Javascript中,void是一個(gè)運(yùn)算符,接受一個(gè)運(yùn)算數(shù),并返回undefined。
void 0; // undefined
這個(gè)命令沒(méi)什么用,而且很令人困惑,建議避免使用。
您可能感興趣的文章:
- JavaScript中的私有成員
- JavaScript語(yǔ)法著色引擎(demo及打包文件下載)
- javascript編程必備_JS語(yǔ)法字典
- javascript新手語(yǔ)法小結(jié)
- javascript基本語(yǔ)法分析說(shuō)明
- JavaScript 私有成員分析
- JavaScript 高級(jí)語(yǔ)法介紹
- 9個(gè)javascript語(yǔ)法高亮插件 推薦
- javascript 語(yǔ)法基礎(chǔ) 想學(xué)習(xí)js的朋友可以看看
- JavaScript 面向?qū)ο蟮闹接谐蓡T和公開(kāi)成員
- JavaScript 面向?qū)ο蟮?私有成員和公開(kāi)成員
- javascript中基于replace函數(shù)的正則表達(dá)式語(yǔ)法
- JavaScript學(xué)習(xí)筆記(一) js基本語(yǔ)法
- Javascript類定義語(yǔ)法,私有成員、受保護(hù)成員、靜態(tài)成員等介紹
- JavaScript建立一個(gè)語(yǔ)法高亮輸入框?qū)崿F(xiàn)思路
- javascript中的void運(yùn)算符語(yǔ)法及使用介紹
- 正則表達(dá)式語(yǔ)法規(guī)則及在Javascript和C#中的使用方法
- 教你如何在 Javascript 文件里使用 .Net MVC Razor 語(yǔ)法
- 基于JavaScript如何實(shí)現(xiàn)私有成員的語(yǔ)法特征及私有成員的實(shí)現(xiàn)方式
相關(guān)文章
簡(jiǎn)單談?wù)刯avascript中this的隱式綁定
在JavaScript中,this 的概念比較復(fù)雜。除了在面向?qū)ο缶幊讨?,this 還是隨處可用的。這篇文章介紹了this的隱式綁定,希望大家能夠喜歡。2016-02-02
appendChild() 或 insertBefore()使用與區(qū)別介紹
appendChild() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表末添加新的子節(jié)點(diǎn)。insertBefore() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表任意位置插入新的節(jié)點(diǎn),下面為大家介紹下具體的使用,感興趣的朋友不要錯(cuò)過(guò)2013-10-10
Javascript核心讀書(shū)有感之詞法結(jié)構(gòu)
這篇文章主要介紹了Javascript核心讀書(shū)有感之詞法結(jié)構(gòu),需要的朋友可以參考下2015-02-02
Javascript基礎(chǔ)教程之a(chǎn)rgument 詳解
這篇文章主要介紹了Javascript基礎(chǔ)教程之a(chǎn)rgument 詳解的相關(guān)資料,需要的朋友可以參考下2015-01-01

