歡迎您光臨本站 註冊首頁

JavaScript語法中12個需要繞開的陷阱

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  本文節選自阮一峰的網路日誌http://www.ruanyifeng.com/blog/,原文標題為《12種不宜使用的Javascript語法》.原文是阮一峰對《Javascript語言精粹》一書的讀後感.該書的作者是Douglas Crockford,他是目前世界上最精通Javascript的人之一,也是Json格式的創造者.他認為Javascript有很多糟粕.因為1995年Brendan Eich設計這種語言的時候,只用了三個月,很多語言特性沒有經過深思熟慮,就推向了市場.結果等到人們意識到這些問題的時候,已經有100萬程序員在使用它了,不可能再大幅修改語言本身了.,Douglas Crockford決定,他要告訴大家,Javascript中哪些部分是精粹,哪些部分是糟粕和雞肋.阮一峰將書中附錄的12種應該避免的JavaScript語法在文中貼出共享,內容如下:

  1. ==

  Javascript有兩組相等運算符,一組是==和!=,另一組是===和!==.前者只比較值的相等,後者除了值以外,還比較類型是否相同.

  請盡量不要使用前一組,永遠只使用===和!==.因為==默認會進行類型轉換,規則十分難記.如果你不相信的話,請回答下面五個判斷式的值是true還是false:

  1.false == 'false'

  2.

  3.false == undefined

  4.

  5.false == null

  6.

  7.null == undefined

  8.

  9.0 == ''

  10.

  前三個是false,后兩個是true.

  2. with

  with的本意是減少鍵盤輸入.比如

  11.obj.a = obj.b;

  12.

  13.obj.c = obj.d;

  14.

  可以簡寫成

  15.with(obj) {

  16.a = b;

  17.c = d;

  18.}

  19.

  但是,在實際運行時,解釋器會判斷obj.b和obj.d是否存在,如果不存在的話,再判斷全局變數b和d是否存在.這樣就導致了低效率,可能會導致意外,因此最好不要使用with語句.

  3. eval

  eval用來直接執行一個字元串.這條語句也是不應該使用的,因為它有性能和安全性的問題,並且是的代碼更難閱讀.

  eval能夠做到的事情,不用它也能做到.比如

  20.eval("myValue = myObject." myKey ";");

  21.

  可以直接寫成

  22.myValue = myObject[myKey];

  23.

  至於ajax操作返回的json字元串,可以使用官方網站提供的解析器json_parse.js運行.

  4. continue

  這條命令的作用是返回到循環的頭部,但是循環本來就會返回到頭部.通過適當的構造,完全可以避免使用這條命令,是的效率得到改善.

  5. switch 貫穿

  switch結構中的case語句,默認是順序執行,除非遇到break,return和throw.有的程序員喜歡利用這個特點,比如

  24.switch(n) {

  25.case 1:

  26.case 2:

  27.break;

  28.}

  29.

  這樣寫容易出錯,難以發現.因此建議避免switch貫穿,凡是有case的地方,一律加上break.

  30.switch(n) {

  31.case 1:

  32.break;

  33.case 2:

  34.break;

  35.}

  36.

  6. 單行的塊結構

  if、while、do和for,都是塊結構語句,但是也可以接受單行命令.比如

  37.if (ok) t = true;

  38.

  甚至寫成

  39.if (ok)

  40.t = true;

  41.

  這樣不利於閱讀代碼,將來添加語句時非常容易出錯.建議不管是否只有一行命令,都一律加上大括弧.

  42.if (ok){

  43.t = true;

  44.}

  45.

  7. 和--

  遞增運算符 和遞減運算符--,直接來自C語言,表面上可以讓代碼變得很緊湊,但是實際上會讓代碼看上去更複雜和更晦澀.因此為了代碼的整潔性和易讀性,不用為好.

  8. 位運算符

  Javascript完全套用了Java的位運算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號的右移>>和用0補足的右移>>>.

  這套運算符針對的是整數,對Javascript完全無用,因為Javascript內部,所有數字都保存為雙精度浮點數.如果使用它們的話,Javascript不得不將運算數先轉為整數,然後再進行運算,這樣就降低了速度.「按位與運算符」&同「邏輯與運算符」&&,很容易混淆.

  9. function語句

  在Javascript中定義一個函數,有兩種寫法:

  46.function foo() { }

  47.

  和

  48.var foo = function () { }

  49.

  兩種寫法完全等價.但是在解析的時候,前一種寫法會被解析器自動提升到代碼的頭部,因此違背了函數應該先定義后使用的要求,建議定義函數時,全部採用后一種寫法.

  10. 基本數據類型的包裝對象

  Javascript的基本數據類型包括字元串、數字、布爾值,它們都有對應的包裝對象String、Number和Boolean.,有人會這樣定義相關值:

  50.new String("Hello World");

  51.

  52.new Number(2000);

  53.

  54.new Boolean(false);

  55.

  這樣寫完全沒有必要,非常費解,因此建議不要使用.

  另外,new Object和new Array也不建議使用,可以用{}和[]代替.

  11. new語句

  Javascript是世界上第一個被大量使用的支持Lambda函數的語言,本質上屬於與Lisp同類的函數式編程語言.但是當前世界,90%以上的程序員都是使用面向對象編程.為了靠近主流,Javascript做出了妥協,採納了類的概念,允許根據類生成對象.

  類是這樣定義的:

  1.var Cat = function (name) {

  2.this.name = name;

  3.this.saying = 'meow' ;

  4.}

  5.

  然後,再生成一個對象

  6.var myCat = new Cat('mimi');

  7.

  這種利用函數生成類、利用new生成對象的語法,其實非常奇怪,一點都不符合直覺.,使用的時候,很容易忘記加上new,就會變成執行函數,然後莫名其妙多出幾個全局變數.,建議不要這樣創建對象,而採用一種變通方法.

  Douglas Crockford給出了一個函數:

  8.Object.beget = function (o) {

  9.var F = function (o) {};

  10.F.prototype = o ;

  11.return new F;

  12.};

  13.

  創建對象時就利用這個函數,對原型對象進行操作:

  14.var Cat = {

  15.name:'',

  16.saying:'meow'

  17.};

  18.

  19.var myCat = Object.beget(Cat);

  20.

  對象生成后,可以自行對相關屬性進行賦值:

  21.myCat.name = 'mimi';

  22.

  12. void

  在大多數語言中,void都是一種類型,表示沒有值.但是在Javascript中,void是一個運算符,接受一個運算數,並返回undefined.

  23.void 0; // undefined

  24.

  這個命令沒什麼用,很令人困惑,建議避免使用.


[火星人 ] JavaScript語法中12個需要繞開的陷阱已經有914次圍觀

http://coctec.com/docs/java/show-post-60360.html