国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 編寫規(guī)范

MartinDai / 1848人閱讀

摘要:如果你想了解更多關(guān)于強(qiáng)制類型轉(zhuǎn)換的信息,你可以讀一讀的這篇文章。在只使用的情況下,所帶來的強(qiáng)制類型轉(zhuǎn)換使得判斷結(jié)果跟蹤變得復(fù)雜,下面的例子可以看出這樣的結(jié)果有多怪了明智地使用真假判斷當(dāng)我們?cè)谝粋€(gè)條件語句中使用變量或表達(dá)式時(shí),會(huì)做真假判斷。

說明

如果本文檔中有任何錯(cuò)誤的、不符合行規(guī)的,敬請(qǐng)斧正。

引言
  

不管有多少人共同參與同一項(xiàng)目,一定要確保每一行代碼都像是同一個(gè)人編寫的。

若您對(duì)本文檔中任何內(nèi)容有不明白的,或者感覺不合行規(guī)的,請(qǐng)您按以下格式向我郵件說明,同時(shí)也歡迎任何人參與討論,共同完善本文檔。本文檔中很多也是根據(jù)我自己現(xiàn)在的公司需求來定的。

  

郵件不是QQ,請(qǐng)盡可能清晰的組織你的語言,將問題描述得更清楚,同時(shí),不要使用過多的樣式化,合乎文檔排版標(biāo)準(zhǔn),謝謝。

規(guī)范內(nèi)容 全局命名空間污染與 IIFE

總是將代碼包裹成一個(gè) IIFE(Immediately-Invoked Function Expression),用以創(chuàng)建獨(dú)立隔絕的定義域。這一舉措可防止全局命名空間被污染。

IIFE 還可確保你的代碼不會(huì)輕易被其它全局命名空間里的代碼所修改(i.e. 第三方庫,window 引用,被覆蓋的未定義的關(guān)鍵字等等)。

不推薦

javascriptvar x = 10,
    y = 100;

console.log(window.x + " " + window.y);

推薦

javascript(function(log, w, undefined){
  "use strict";

  var x = 10,
      y = 100;

  // 將輸出 "true true"
  log((w.x === undefined) + " " + (w.y === undefined));

}(window.console.log, window));
IIFE(立即執(zhí)行的函數(shù)表達(dá)式)

無論何時(shí),想要?jiǎng)?chuàng)建一個(gè)新的封閉的定義域,那就用 IIFE。它不僅避免了干擾,也使得內(nèi)存在執(zhí)行完后立即釋放。

所有腳本文件建議都從 IIFE 開始。

立即執(zhí)行的函數(shù)表達(dá)式的執(zhí)行括號(hào)應(yīng)該寫在外包括號(hào)內(nèi)。雖然寫在內(nèi)還是寫在外都是有效的,但寫在內(nèi)使得整個(gè)表達(dá)式看起來更像一個(gè)整體,因此推薦這么做。

不推薦

(function(){})();

推薦

(function(){}());

所以,請(qǐng)用下列寫法來格式化你的 IIFE 代碼:

javascript(function(){
  "use strict";

  // 你的代碼寫在這里

}());

如果你想引用全局變量或者是外層 IIFE 的變量,可以通過下列方式傳參:

javascript(function($, w, d){
  "use strict";

  $(function() {
    w.alert(d.querySelectorAll("div").length);
  });
}(jQuery, window, document));
嚴(yán)格模式

ECMAScript 5 嚴(yán)格模式可在整個(gè)腳本或獨(dú)個(gè)方法內(nèi)被激活。它對(duì)應(yīng)不同的 javascript 語境會(huì)做更加嚴(yán)格的錯(cuò)誤檢查。嚴(yán)格模式也確保了 javascript 代碼更加的健壯,運(yùn)行的也更加快速。

嚴(yán)格模式會(huì)阻止使用在未來很可能被引入的預(yù)留關(guān)鍵字。

你應(yīng)該在你的腳本中啟用嚴(yán)格模式,最好是在獨(dú)立的 IIFE 中應(yīng)用它。避免在你的腳本第一行使用它而導(dǎo)致你的所有腳本都啟動(dòng)了嚴(yán)格模式,這有可能會(huì)引發(fā)一些第三方類庫的問題。

不推薦

javascript// 代碼從這里開始
"use strict";

(function(){

  // 你在代碼寫在這里

}());

推薦

javascript(function(){
  "use strict";

  // 你在代碼寫在這里

}());
變量聲明

總是使用 var 來聲明變量。如不指定 var,變量將被隱式地聲明為全局變量,這將對(duì)變量難以控制。如果沒有聲明,變量處于什么定義域就變得不清(可以是在 documentwindow 中,也可以很容易地進(jìn)入本地定義域)。所以,請(qǐng)總是使用 var 來聲明變量。

采用嚴(yán)格模式帶來的好處是,當(dāng)你手誤輸入錯(cuò)誤的變量名時(shí),它可以通過報(bào)錯(cuò)信息來幫助你定位錯(cuò)誤出處。

不推薦

x = 10;
y = 100;

推薦

var x = 10,
    y = 100;
理解 JavaScript 的定義域和定義域提升

在 JavaScript 中變量和方法定義會(huì)自動(dòng)提升到執(zhí)行之前。JavaScript 只有 function 級(jí)的定義域,而無其他很多編程語言中的塊定義域,所以使得你在某一 function 內(nèi)的某語句和循環(huán)體中定義了一個(gè)變量,此變量可作用于整個(gè) function 內(nèi),而不僅僅是在此語句或循環(huán)體中,因?yàn)樗鼈兊穆暶鞅?JavaScript 自動(dòng)提升了。

我們通過例子來看清楚這到底是怎么一回事:

原 function

javascript(function(log){
  "use strict";

  var a = 10;

  for(var i = 0; i < a; i++) {
    var b = i * i;
    log(b);
  }

  if(a === 10) {
    var f = function() {
      log(a);
    };
    f();
  }

  function x() {
    log("Mr. X!");
  }
  x();

}(window.console.log));

被 JS 提升過后

javascript(function(log){
  "use strict";
  // 在封閉環(huán)境中使用的所有變量將被提升到函數(shù)的頂部
  var a,
      i,
      b,
      f;
  // 所有的函數(shù)也將被提升到函數(shù)頂部
  function x() {
    log("Mr. X!");
  }

  a = 10;

  for(i = 0; i < a; i++) {
    b = i * i;
    log(b);
  }

  if(a === 10) {
    // 功能分配只會(huì)導(dǎo)致懸掛變量,但在函數(shù)體不會(huì)被懸掛
    // 只有用真正的函數(shù)聲明的整體功能才能懸掛
    f = function() {
      log(a);
    };
    f();
  }

  x();

}(window.console.log));

根據(jù)以上提升過程,你是否可理解以下代碼?

有效代碼

javascript(function(log){
  "use strict";

  var a = 10;

  i = 5;

  x();

  for(var i; i < a; i++) {
    log(b);
    var b = i * i;
  }

  if(a === 10) {
    f = function() {
      log(a);
    };
    f();

    var f;
  }

  function x() {
    log("Mr. X!");
  }

}(window.console.log));

正如你所看到的這段令人充滿困惑與誤解的代碼導(dǎo)致了出人意料的結(jié)果。只有良好的聲明習(xí)慣,也就是下一章節(jié)我們要提到的聲明規(guī)則,才能盡可能的避免這類錯(cuò)誤風(fēng)險(xiǎn)。

提升聲明

為避免上一章節(jié)所述的變量和方法定義被自動(dòng)提升造成誤解,把風(fēng)險(xiǎn)降到最低,我們應(yīng)該手動(dòng)地顯示地去聲明變量與方法。也就是說,所有的變量以及方法,應(yīng)當(dāng)定義在 function 內(nèi)的首行。

只用一個(gè) var 關(guān)鍵字聲明,多個(gè)變量用逗號(hào)隔開。

不推薦

(function(log){
"use strict";

var a = 10;
var b = 10;

for(var i = 0; i < 10; i++) {
var c = a * b * i;
}

function f() {

}

var d = 100;
var x = function() {
return d * d;
};
log(x());

}(window.console.log));


**推薦** ```javascript (function(log){ "use strict"; var a = 10, b = 10, i, c, d, x; function f() { } for(i = 0; i < 10; i++) { c = a * b * i; } d = 100; x = function() { return d * d; }; log(x()); }(window.console.log));

把賦值盡量寫在變量申明中。

不推薦

javascriptvar a,
    b,
    c;

a = 10;
b = 10;
c = 100;
推薦
javascriptvar a = 10,
    b = 10,
    c = 100;
總是使用帶類型判斷的比較判斷

總是使用 === 精確的比較操作符,避免在判斷的過程中,由 JavaScript 的強(qiáng)制類型轉(zhuǎn)換所造成的困擾。

如果你使用 === 操作符,那比較的雙方必須是同一類型為前提的條件下才會(huì)有效。

如果你想了解更多關(guān)于強(qiáng)制類型轉(zhuǎn)換的信息,你可以讀一讀 Dmitry Soshnikov 的這篇文章。

在只使用 == 的情況下,JavaScript 所帶來的強(qiáng)制類型轉(zhuǎn)換使得判斷結(jié)果跟蹤變得復(fù)雜,下面的例子可以看出這樣的結(jié)果有多怪了:

javascript(function(log){
  "use strict";

  log("0" == 0); // true
  log("" == false); // true
  log("1" == true); // true
  log(null == undefined); // true

  var x = {
    valueOf: function() {
      return "X";
    }
  };

  log(x == "X");

}(window.console.log));
明智地使用真假判斷

當(dāng)我們?cè)谝粋€(gè) if 條件語句中使用變量或表達(dá)式時(shí),會(huì)做真假判斷。if(a == true) 是不同于 if(a) 的。后者的判斷比較特殊,我們稱其為真假判斷。這種判斷會(huì)通過特殊的操作將其轉(zhuǎn)換為 truefalse,下列表達(dá)式統(tǒng)統(tǒng)返回 falsefalse, 0, undefined, null, NaN, ""(空字符串).

這種真假判斷在我們只求結(jié)果而不關(guān)心過程的情況下,非常的有幫助。

以下示例展示了真假判斷是如何工作的:

javascript(function(log){
  "use strict";

  function logTruthyFalsy(expr) {
    if(expr) {
      log("truthy");
    } else {
      log("falsy");
    }
  }

  logTruthyFalsy(true); // truthy
  logTruthyFalsy(1); // truthy
  logTruthyFalsy({}); // truthy
  logTruthyFalsy([]); // truthy
  logTruthyFalsy("0"); // truthy

  logTruthyFalsy(false); // falsy
  logTruthyFalsy(0); // falsy
  logTruthyFalsy(undefined); // falsy
  logTruthyFalsy(null); // falsy
  logTruthyFalsy(NaN); // falsy
  logTruthyFalsy(""); // falsy

}(window.console.log));
變量賦值時(shí)的邏輯操作

邏輯操作符 ||&& 也可被用來返回布爾值。如果操作對(duì)象為非布爾對(duì)象,那每個(gè)表達(dá)式將會(huì)被自左向右地做真假判斷。基于此操作,最終總有一個(gè)表達(dá)式被返回回來。這在變量賦值時(shí),是可以用來簡化你的代碼的。

不推薦

javascriptif(!x) {
  if(!y) {
    x = 1;
  } else {
    x = y;
  }
}

推薦

x = x || y || 1;

這一小技巧經(jīng)常用來給方法設(shè)定默認(rèn)的參數(shù)。

javascript(function(log){
  "use strict";

  function multiply(a, b) {
    a = a || 1;
    b = b || 1;

    log("結(jié)果 " + a * b);
  }

  multiply(); // 結(jié)果 1
  multiply(10); // 結(jié)果 10
  multiply(3, NaN); // 結(jié)果 3
  multiply(9, 5); // 結(jié)果 45

}(window.console.log));
分號(hào)

總是使用分號(hào),因?yàn)殡[式的代碼嵌套會(huì)引發(fā)難以察覺的問題。當(dāng)然我們更要從根本上來杜絕這些問題[1] 。以下幾個(gè)示例展示了缺少分號(hào)的危害:

javascript// 1.
MyClass.prototype.myMethod = function() {
  return 42;
}  // 這里沒有分號(hào)

(function() {
  // 包裹在一個(gè)函數(shù)的一些初始化代碼,用來創(chuàng)建當(dāng)本地變量。
})();


var x = {
  "i": 1,
  "j": 2
}  // 這里也沒有分號(hào)

// 2.  嘗試在 IE 或者 Firefox 瀏覽器上運(yùn)行

[ffVersion, ieVersion][isIE]();


var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  // 這里也沒有分號(hào)

// 3. 
-1 == resultOfOperation() || die();

那么,發(fā)生了什么?

JavaScript 錯(cuò)誤 —— 首先返回 42 的那個(gè) function 被第二個(gè) function 當(dāng)中參數(shù)傳入調(diào)用,接著數(shù)字 42 也被“調(diào)用”而導(dǎo)致出錯(cuò);

八成你會(huì)得到 no such property in undefined 的錯(cuò)誤提示,因?yàn)樵谡鎸?shí)環(huán)境中的調(diào)用是這個(gè)樣子:x[ffVersion, ieVersion][isIE]()

die 總是被調(diào)用。因?yàn)閿?shù)組減 1 的結(jié)果是 NaN,它不等于任何東西(無論 resultOfOperation 是否返回 NaN)。所以最終的結(jié)果是 die() 執(zhí)行完所獲得值將賦給 THINGS_TO_EAT

為什么會(huì)這樣?

JavaScript 中語句要以分號(hào)結(jié)束,否則它將會(huì)繼續(xù)執(zhí)行下去,不管換不換行。以上的每一個(gè)示例中,函數(shù)聲明或?qū)ο蠡驍?shù)組,都變成了在一句語句體內(nèi)。要知道閉合圓括號(hào)并不代表語句結(jié)束,JavaScript 不會(huì)終結(jié)語句,除非它的下一個(gè) token 是一個(gè)中綴符[2] 或者是圓括號(hào)操作符。

這真是讓人大吃一驚,所以乖乖地給語句末加上分號(hào)吧。

澄清:分號(hào)與函數(shù)

分號(hào)需要用在表達(dá)式的結(jié)尾,而并非函數(shù)聲明的結(jié)尾。區(qū)分它們最好的例子是:

javascriptvar foo = function() {
  return true;
};  // 這里需要分號(hào)

function foo() {
  return true;
}  // 這里需要分號(hào)
嵌套函數(shù)

嵌套函數(shù)是非常有用的,比如用在持續(xù)創(chuàng)建和隱藏輔助函數(shù)的任務(wù)中。你可以非常自由隨意地使用它們。

語句塊內(nèi)的函數(shù)聲明

切勿在語句塊內(nèi)聲明函數(shù),在 ECMAScript 5 的嚴(yán)格模式下,這是不合法的。函數(shù)聲明應(yīng)該在定義域的頂層。但在語句塊內(nèi)可將函數(shù)申明轉(zhuǎn)化為函數(shù)表達(dá)式賦值給變量。

不推薦

javascriptif (x) {
  function foo() {}
}

推薦

javascriptif (x) {
  var foo = function() {};
}
異常

基本上你無法避免出現(xiàn)異常,特別是在做大型開發(fā)時(shí)(使用應(yīng)用開發(fā)框架等等)。

在沒有自定義異常的情況下,從有返回值的函數(shù)中返回錯(cuò)誤信息一定非常的棘手,更別提多不優(yōu)雅了。不好的解決方案包括了傳第一個(gè)引用類型來接納錯(cuò)誤信息,或總是返回一個(gè)對(duì)象列表,其中包含著可能的錯(cuò)誤對(duì)象。以上方式基本上是比較簡陋的異常處理方式。適時(shí)可做自定義異常處理。

在復(fù)雜的環(huán)境中,你可以考慮拋出對(duì)象而不僅僅是字符串(默認(rèn)的拋出值)。

javascriptif(name === undefined) {
  throw {
    name: "系統(tǒng)錯(cuò)誤",
    message: "任何時(shí)候都應(yīng)該定義一個(gè) name!"
  }
}
標(biāo)準(zhǔn)特性

總是優(yōu)先考慮使用標(biāo)準(zhǔn)特性。為了最大限度地保證擴(kuò)展性與兼容性,總是首選標(biāo)準(zhǔn)的特性,而不是非標(biāo)準(zhǔn)的特性(例如:首選 string.charAt(3)而不是 string[3];首選 DOM 的操作方法來獲得元素引用,而不是某一應(yīng)用特定的快捷方法)。

簡易的原型繼承

如果你想在 JavaScript 中繼承你的對(duì)象,請(qǐng)遵循一個(gè)簡易的模式來創(chuàng)建此繼承。如果你預(yù)計(jì)你會(huì)遇上復(fù)雜對(duì)象的繼承,那可以考慮采用一個(gè)繼承庫,比如 Proto.js by Axel Rauschmayer

簡易繼承請(qǐng)用以下方式:

javascript(function(log){
  "use strict";

  // 構(gòu)建函數(shù)
  function Apple(name) {
    this.name = name;
  }
  // 定義一個(gè) apple 的方法
  Apple.prototype.eat = function() {
    log("吃 " + this.name);
  };

  // 構(gòu)建函數(shù)
  function GrannySmithApple() {
    // 執(zhí)行父級(jí)構(gòu)建函數(shù)
    Apple.prototype.constructor.call(this, "Foobar");
  }
  // 當(dāng)復(fù)制時(shí),設(shè)置父級(jí) prototype Object.create
  FoobarApple.prototype = Object.create(Apple.prototype);
  // 設(shè)置構(gòu)建函數(shù)為子類型
  FoobarApple.prototype.constructor = FoobarApple;

  // 呼叫頂級(jí)方法
  FoobarApple.prototype.eat = function() {
    // 確定您已經(jīng)通過 call(this) 將它應(yīng)用到了正確的對(duì)象中
    Apple.prototype.eat.call(this);

    log("可憐的 Foobar");
  };

  // 實(shí)例
  var apple = new Apple("測試蘋果");
  var foobarApple = new FoobarApple();

  log(apple.name); // 測試蘋果
  log(foobarApple.name); // Foobar

  // 實(shí)例檢測
  log(apple instanceof Apple); // true
  log(apple instanceof FoobarApple); // false

  log(foobarApple instanceof Apple); // true
  log(foobarApple instanceof FoobarApple); // true

  // 執(zhí)行呼叫了頂級(jí)方法的方法
  foobarApple.eat();

}(window.console.log));
使用閉包

閉包的創(chuàng)建也許是 JS 最有用也是最易被忽略的能力了,查看《關(guān)于閉包如何工作的合理解釋》。

切勿在循環(huán)中創(chuàng)建函數(shù)

在簡單的循環(huán)語句中加入函數(shù)是非常容易形成閉包而帶來隱患的。下面的例子就是一個(gè)典型的陷阱:

不推薦

javascript(function(log, w){
  "use strict";

  // 在本閉包中,numbers 與 i 被定義
  var numbers = [1, 2, 3],
      i;

  for(i = 0; i < numbers.length; i++) {
    w.setTimeout(function() {
      // 本斷代碼最終將彈出三次對(duì)話框,而內(nèi)容均是:
      // 第 3 個(gè)數(shù)字為 undefined
      // 這是因?yàn)椋琲 在循環(huán)之前被定義,而 for 循環(huán)之后,將 i 的值變?yōu)?3
      // 接著, alert 執(zhí)行,此時(shí), alert 中的 i 將只為 3,
      // 同時(shí),numbers[3] 為 undefined
      w.alert("第 " + i + " 個(gè)數(shù)字為 " + numbers[i]);
    }, 0);
  }

}(window.console.log, window));

接下來的改進(jìn)雖然已經(jīng)解決了上述例子中的問題或 bug,但還是違反了不在循環(huán)中創(chuàng)建函數(shù)或閉包的原則。

不推薦

javascript(function(log, w){
  "use strict";

  // 在本閉包中,numbers 與 i 被定義
  var numbers = [1, 2, 3],
      i;

  for(i = 0; i < numbers.length; i++) {
    // 創(chuàng)建一個(gè)新的閉包函數(shù)
    (function(index, number){
      w.setTimeout(function() {
        // Will output as expected 0 > 1, 1 > 2, 2 > 3
        w.alert("Index " + index + " with number " + number);
      }, 0);
    }(i, numbers[i]));
  }

}(window.console.log, window));

接下來的改進(jìn)已解決問題,而且也遵循了規(guī)范。可是,你會(huì)發(fā)現(xiàn)看上去似乎過于復(fù)雜繁冗了,應(yīng)該會(huì)有更好的解決方案吧。

不完全推薦

javascript(function(log, w){
  "use strict";

  // 在本閉包中,numbers 與 i 被定義
  var numbers = [1, 2, 3],
      i;

  // 在 for 循環(huán)外面創(chuàng)建一個(gè)函數(shù)
  function alertIndexWithNumber(index, number) {
    return function() {
      w.alert("Index " + index + " with number " + number);
    };
  }

  // 
  for(i = 0; i < numbers.length; i++) {
    w.setTimeout(alertIndexWithNumber(i, numbers[i]), 0);
  }

}(window.console.log, window));

將循環(huán)語句轉(zhuǎn)換為函數(shù)執(zhí)行的方式問題能得到立馬解決,每一次循環(huán)都會(huì)對(duì)應(yīng)地創(chuàng)建一次閉包。函數(shù)式的風(fēng)格更加值得推薦,而且看上去也更加地自然和可預(yù)料。

推薦

javascript(function(log, w){
  "use strict";

  // 在本閉包中,numbers 與 i 被定義
  var numbers = [1, 2, 3],
      i;

  numbers.forEach(function(number, index) {
    w.setTimeout(function() {
      w.alert("Index " + index + " with number " + number);
    }, 0);
  });

}(window.console.log, window));
eval 函數(shù)(魔鬼)

eval() 不但混淆語境還很危險(xiǎn),總會(huì)有比這更好、更清晰、更安全的另一種方案來寫你的代碼,因此盡量不要使用 evil 函數(shù)。

this 關(guān)鍵字

只在對(duì)象構(gòu)造器、方法和在設(shè)定的閉包中使用 this 關(guān)鍵字。this 的語義在此有些誤導(dǎo)。它時(shí)而指向全局對(duì)象(大多數(shù)時(shí)),時(shí)而指向調(diào)用者的定義域(在 eval 中),時(shí)而指向 DOM 樹中的某一節(jié)點(diǎn)(當(dāng)用事件處理綁定到 HTML 屬性上時(shí)),時(shí)而指向一個(gè)新創(chuàng)建的對(duì)象(在構(gòu)造器中),還時(shí)而指向其它的一些對(duì)象(如果函數(shù)被 call()apply() 執(zhí)行和調(diào)用時(shí))。

正因?yàn)樗侨绱巳菀椎乇桓沐e(cuò),請(qǐng)限制它的使用場景:

在構(gòu)造函數(shù)中

在對(duì)象的方法中(包括由此創(chuàng)建出的閉包內(nèi))

首選函數(shù)式風(fēng)格

函數(shù)式編程讓你可以簡化代碼并縮減維護(hù)成本,因?yàn)樗菀讖?fù)用,又適當(dāng)?shù)亟怦詈透俚囊蕾嚒?/p>

接下來的例子中,在一組數(shù)字求和的同一問題上,比較了兩種解決方案。第一個(gè)例子是經(jīng)典的程序處理,而第二個(gè)例子則是采用了函數(shù)式編程和 ECMA Script 5.1 的數(shù)組方法。

  

例外:往往在重代碼性能輕代碼維護(hù)的情況之下,要選擇最優(yōu)性能的解決方案而非維護(hù)性高的方案(比如用簡單的循環(huán)語句代替 forEach)。

不推薦

javascript(function(log){
  "use strict";

  var arr = [10, 3, 7, 9, 100, 20],
      sum = 0,
      i;


  for(i = 0; i < arr.length; i++) {
    sum += arr[i];
  }

  log("數(shù)組 " + arr + " 的和為:" + sum)

}(window.console.log));

推薦

javascript(function(log){
  "use strict";

  var arr = [10, 3, 7, 9, 100, 20];

  var sum = arr.reduce(function(prevValue, currentValue) {
    return prevValue + currentValue;
  }, 0);

  log("數(shù)組 " + arr + " 的和為:" + sum)

}(window.console.log));

另一個(gè)例子通過某一規(guī)則對(duì)一個(gè)數(shù)組進(jìn)行過濾匹配來創(chuàng)建一個(gè)新的數(shù)組。

不推薦

javascript(function(log){
  "use strict";

  var numbers = [11, 3, 7, 9, 100, 20, 14, 10],
      numbersGreaterTen = [],
      i;


  for(i = 0; i < numbers.length; i++) {
    if(numbers[i] > 10) {
      numbersGreaterTen.push(numbers[i]);
    }
  }

  log("列表 numbers " + numbers + " 中只有 " + numbersGreaterTen + " 個(gè)數(shù)字大于 10");

}(window.console.log));

推薦

javascript(function(log){
  "use strict";

  var numbers = [11, 3, 7, 9, 100, 20, 14, 10];

  var numbersGreaterTen = numbers.filter(function(element) {
    return element > 10;
  });

  log("列表 numbers " + numbers + " 中只有 " + numbersGreaterTen + " 個(gè)數(shù)字大于 10");

}(window.console.log));
使用 ECMA Script 5

建議使用 ECMA Script 5 中新增的語法糖和函數(shù)。這將簡化你的程序,并讓你的代碼更加靈活和可復(fù)用。

數(shù)組和對(duì)象的屬性迭代

用 ECMA5 的迭代方法來迭代數(shù)組。使用 Array.forEach 或者如果你要在特殊場合下中斷迭代,那就用 Array.every

javascript(function(log){
  "use strict";

  // 遍歷一個(gè)數(shù)據(jù),然后在某個(gè)條件達(dá)到時(shí),終止遍歷
  [1, 2, 3, 4, 5].every(function(element, index, arr) {
    log(element + " at index " + index + " in array " + arr);

    if(index !== 5) {
      return true;
    }
  });

  // 定義一個(gè)簡單的 JavaScript 對(duì)象
  var obj = {
    a: "A",
    b: "B",
    "c-d-e": "CDE"
  };

  // 遍歷對(duì)象的鍵
  Object.keys(obj).forEach(function(element, index, arr) {
    log("鍵 " + element + " 的值為 " + obj[element]);
  });

}(window.console.log));
不要使用 switch

switch 在所有的編程語言中都是個(gè)非常錯(cuò)誤的難以控制的語句,建議用 if else 來替換它。

數(shù)組和對(duì)象字面量

用數(shù)組和對(duì)象字面量來代替數(shù)組和對(duì)象構(gòu)造器。數(shù)組構(gòu)造器很容易讓人在它的參數(shù)上犯錯(cuò)。

不推薦

javascript// 長度為 3.
var a1 = new Array(x1, x2, x3);

// 長度為2
var a2 = new Array(x1, x2);

// 如果 x1 是一個(gè)數(shù)字,并且他還是一個(gè)自然數(shù),那么長度將為 x1
// 如果 x1 是一個(gè)數(shù)字,但是它不是一個(gè)自然數(shù),那么將報(bào)出一個(gè)異常
// 其它的情況下數(shù)組將包含一個(gè)只有 x1 一個(gè)元素的數(shù)組
var a3 = new Array(x1);

// 長度為0 0.
var a4 = new Array();

正因如此,如果將代碼傳參從兩個(gè)變?yōu)橐粋€(gè),那數(shù)組很有可能發(fā)生意料不到的長度變化。為避免此類怪異狀況,請(qǐng)總是采用更多可讀的數(shù)組字面量。

推薦

javascriptvar a = [x1, x2, x3];
var a2 = [x1, x2];
var a3 = [x1];
var a4 = [];

對(duì)象構(gòu)造器不會(huì)有類似的問題,但是為了可讀性和統(tǒng)一性,我們應(yīng)該使用對(duì)象字面量。

不推薦

javascriptvar o = new Object();

var o2 = new Object();
o2.a = 0;
o2.b = 1;
o2.c = 2;
o2["strange key"] = 3;

應(yīng)該寫成這樣:

推薦

javascriptvar o = {};

var o2 = {
  a: 0,
  b: 1,
  c: 2,
  "strange key": 3
};
修改內(nèi)建對(duì)象的原型鏈

修改內(nèi)建的諸如 Object.prototypeArray.prototype 是被嚴(yán)厲禁止的。修改其它的內(nèi)建對(duì)象比如 Function.prototype,雖危害沒那么大,但始終還是會(huì)導(dǎo)致在開發(fā)過程中難以 debug 的問題,應(yīng)當(dāng)也要避免。

自定義 toString() 方法

你可以通過自定義 toString() 來控制對(duì)象字符串化。這很好,但你必須保證你的方法總是成功并不會(huì)有其它副作用。如果你的方法達(dá)不到這樣的標(biāo)準(zhǔn),那將會(huì)引發(fā)嚴(yán)重的問題。如果 toString() 調(diào)用了一個(gè)方法,這個(gè)方法做了一個(gè)斷言1 ,當(dāng)斷言失敗,它可能會(huì)輸出它所在對(duì)象的名稱,當(dāng)然對(duì)象也需要調(diào)用 toString()

圓括號(hào)

一般在語法和語義上真正需要時(shí)才謹(jǐn)慎地使用圓括號(hào)。不要用在一元操作符上,例如 delete, typeofvoid,或在關(guān)鍵字之后,例如 return, throw, case, new 等。

字符串

統(tǒng)一使用單引號(hào)"",不使用雙引號(hào)""。這在創(chuàng)建 HTML 字符串非常有好處:

var msg = "這是一段HTML 
";
三元條件判斷(if 的快捷方法)

用三元操作符分配或返回語句。在比較簡單的情況下使用,避免在復(fù)雜的情況下使用。沒人愿意用 10 行三元操作符把自己的腦子繞暈。

不推薦

javascriptif(x === 10) {
  return "valid";
} else {
  return "invalid";
}

推薦

return x === 10 ? "valid" : "invalid";

斷言一般指程序員在測試測序時(shí)的假設(shè),一般是一些布爾表達(dá)式,當(dāng)返回是 true 時(shí),斷言為真,代碼運(yùn)行會(huì)繼續(xù)進(jìn)行;如果條件判斷為 false,代碼運(yùn)行停止,你的應(yīng)用被終止。??

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85652.html

相關(guān)文章

  • 編寫靈活、穩(wěn)定、高質(zhì)量的HTML代碼的規(guī)范

    摘要:六字符編碼通過明確聲明字符編碼,能夠確保瀏覽器快速并容易的判斷頁面內(nèi)容的渲染方式。十一減少標(biāo)簽的數(shù)量編寫代碼時(shí),盡量避免多余的父元素。未完待續(xù)編寫靈活穩(wěn)定高質(zhì)量的代碼的規(guī)范閱讀更多 一、唯一定律 無論有多少人共同參與同一項(xiàng)目,一定要確保每一行代碼都像是唯一個(gè)人編寫的。 二、HTML 2.1 語法 (1)用兩個(gè)空格來代替制表符(tab) -- 這是唯一能保證在所有環(huán)境下獲得一致展現(xiàn)的方法...

    anquan 評(píng)論0 收藏0
  • nodejs筆記-模塊機(jī)制

    摘要:模塊中定義的全局變量只作用于該文件內(nèi)部,不污染其他模塊。由純編寫的部分稱為內(nèi)建模塊,例等模塊部分使用編寫。兼容多種模塊規(guī)范檢測是否為或者檢測是否為或環(huán)境定義為普通模塊將模塊執(zhí)行結(jié)果掛載在對(duì)象下 1.為什么要CommonJS規(guī)范 javascript存在的缺點(diǎn) 沒有模塊系統(tǒng) 標(biāo)準(zhǔn)庫比較少 沒有標(biāo)準(zhǔn)接口 缺乏包管理系統(tǒng) CommonJS規(guī)范的提出,彌補(bǔ)了javascript沒有標(biāo)準(zhǔn)的缺...

    lscho 評(píng)論0 收藏0
  • 前端背景知識(shí)查漏補(bǔ)缺

    摘要:提交內(nèi)容可以是一個(gè)提議想法初步描述該階段是對(duì)所提交新特性的正式建議。在這個(gè)階段需具備以下條件指定一名成員作為審閱通過有實(shí)現(xiàn)的或者初步編寫標(biāo)準(zhǔn),包括問題描述解決方案示例語法語義關(guān)鍵的算法及抽象實(shí)現(xiàn)在的復(fù)雜度等該階段是會(huì)出現(xiàn)標(biāo)準(zhǔn)中的第一個(gè)版本。 ECMAScript 與 JavaScript ECMAScript 是一套腳本語言的規(guī)范,內(nèi)部編號(hào) ECMA-262 該規(guī)范由 Ecma(Eu...

    developerworks 評(píng)論0 收藏0
  • 前端背景知識(shí)查漏補(bǔ)缺

    摘要:提交內(nèi)容可以是一個(gè)提議想法初步描述該階段是對(duì)所提交新特性的正式建議。在這個(gè)階段需具備以下條件指定一名成員作為審閱通過有實(shí)現(xiàn)的或者初步編寫標(biāo)準(zhǔn),包括問題描述解決方案示例語法語義關(guān)鍵的算法及抽象實(shí)現(xiàn)在的復(fù)雜度等該階段是會(huì)出現(xiàn)標(biāo)準(zhǔn)中的第一個(gè)版本。 ECMAScript 與 JavaScript ECMAScript 是一套腳本語言的規(guī)范,內(nèi)部編號(hào) ECMA-262 該規(guī)范由 Ecma(Eu...

    incredible 評(píng)論0 收藏0
  • 編碼規(guī)范 —— 編寫靈活、穩(wěn)定、高質(zhì)量的 HTML 和 CSS 代碼的規(guī)范

    摘要:用兩個(gè)空格代替制表符這是唯一能保證在所有環(huán)境下獲得一致展現(xiàn)的方法。編輯器配置將你的編輯器按照下面的配置進(jìn)行設(shè)置,以免常見的代碼不一致和差異用兩個(gè)空格代替制表符保存文件時(shí)刪除尾部的空白符設(shè)置文件編碼為在文件結(jié)尾添加一個(gè)空白行。 黃金定律 永遠(yuǎn)遵循同一套編碼規(guī)范 - 可以是這里列出的,也可以是你自己總結(jié)的。如果發(fā)現(xiàn)規(guī)范中有任何錯(cuò)誤,敬請(qǐng)指正。 HTML 語法 用兩個(gè)空格代替制表符 (ta...

    Karuru 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<