首頁 > web前端 > js教程 > 主體

JavaScript-總結常用程式碼書寫規範

黄舟
發布: 2017-02-22 13:21:23
原創
1029 人瀏覽過

javascript 程式碼規格

程式碼規格我們應該遵循古老的原則:「能做並不意味著應該做」。

全域命名空間污染

總是將程式碼包裹在一個立即的函數表達式裡面,形成一個獨立的模組。

不推薦

var x = 10,
    y = 100;
console.log(window.x + ' ' + window.y);
登入後複製

推薦

;(function(window){
    'use strict';
    var x = 10,
        y = 100;
    console.log(window.x + ' ' + window.y);
}(window));
登入後複製

立即執行函數

立即執行函數裡面,如果有用到全域變數應該透過變數傳遞的方式,讓立即執行函數的函數體在調用時,能以局部變數的形式調用,在一定程度上提升程式效能。

並且應該在立即執行函數的形參裡加上undefined,在最後一個位置,這是因為ES3裡undefined是可以讀寫的,如果在全域位置更改undefined的值,你的程式碼可能得不到逾期的結果。

另外推薦在立即執行函數開始跟結尾都加上上分號,避免在合併時因為別人的程式碼不規範而影響到我們自己的程式碼

#不推薦

(function(){
    'use strict';
    var x = 10,
        y = 100,
        c,
        elem=$('body');
    console.log(window.x + ' ' + window.y);
    $(document).on('click',function(){

    });
    if(typeof c==='undefined'){
        //你的代码
    }
}());
登入後複製

推薦

;(function($,window,document,undefined){
    'use strict';
    var x = 10,
        y = 100,
        c,
        elem=$('body');
    console.log(window.x + ' ' + window.y);
    $(document).on('click',function(){

    });
    if(typeof c==='undefined'){
        //你的代码
    }
}(jQuery,window,document));
登入後複製

嚴格模式

ECMAScript 5 嚴格模式可在整個腳本或獨個方法內被激活。它對應不同的 javascript 情境會做更嚴格的錯誤檢定。嚴格模式也確保了 javascript 程式碼更加的健壯,運作的也更加快速。

嚴格模式會阻止使用在未來很可能被引入的預留關鍵字。

你應該在你的腳本中啟用嚴格模式,最好是在獨立的 立即執行函數 中應用它。避免在你的腳本第一行使用它而導致你的所有腳本都啟動了嚴格模式,這有可能會引發一些第三方類別庫的問題。

不推薦

'use strict';
(function(){

}());
登入後複製

推薦

(function(){
    'use strict';
}());
登入後複製

變數聲明

對所有的變數聲明,我們都應該指定var,如果沒有指定var,在嚴格模式下會報錯,並且同一個作用域內的變數應該盡量採用一個var去聲明,多個變數用“,”隔開。

不推薦

function myFun(){
    x=5;
    y=10;
}
登入後複製

不完全推薦

function myFun(){
    var x=5;
    var y=10;
}
登入後複製

推薦

function myFun(){
    var x=5,
        y=10;
}
登入後複製

使用帶有類型判斷的比較判斷

總是使用=== 精確的比較運算符,避免在判斷的過程中,由JavaScript 的強制型別轉換所造成的困擾。

如果你使用 === 運算符,那麼比較的雙方必須是同一型別為前提的條件下才會有效。

不推薦

(function(w){
  'use strict';

  w.console.log('0' == 0); // true
  w.console.log('' == false); // true
  w.console.log('1' == true); // true
  w.console.log(null == undefined); // true

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

  w.console.log(x == 'X');//true

}(window.console.log));
登入後複製

推薦

(function(w){
  'use strict';

  w.console.log('0' === 0); // false
  w.console.log('' === false); // false
  w.console.log('1' === true); // false
  w.console.log(null === undefined); // false

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

  w.console.log(x === 'X');//false

}(window));
登入後複製

變數賦值時的邏輯運算

邏輯運算符|| 和&& 也可用來傳回布林值。如果操作對象為非布林對象,那麼每個表達式將會被自左向右地做真假判斷。基於此操作,最終總有一個表達式被返回回來。這在變數賦值時,是可以用來簡化你的程式碼的。

不推薦

if(!x) {
  if(!y) {
    x = 1;
  } else {
    x = y;
  }
}
登入後複製

推薦

x = x || y || 1;
登入後複製

分號

總是使用分號,因為隱式的程式碼嵌套會引發難以察覺的問題。當然我們更要從根本上來杜絕這些問題[1] 。以下幾個範例展示了缺少分號的危害:

// 1.
MyClass.prototype.myMethod = function() {
  return 42;
}  //这里没有分号

(function() {

})();

 //2.
var x = {
  'i': 1,
  'j': 2
}  // 这里没有分号
//我知道这样的代码你可能永远不会写,但是还是举一个例子
[ffVersion, ieVersion][isIE]();

 // 3.
var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  // 这里没有分号

-1 == resultOfOperation() || die();
登入後複製

錯誤結果

  1. #JavaScript 錯誤- 首先傳回42 的那個function 被第二個function 當中參數傳入調用,接著數字42 也被「調用」而導致出錯。

  2. 八成你會得到'no such property in undefined' 的錯誤提示,因為在真實環境中的呼叫是這個樣子:xffVersion, ieVersion().

  3. die 總是被召喚。因為數組減 1 的結果是 NaN,它不等於任何東西(無論 resultOfOperation 是否回傳 NaN)。所以最後的結果是die() 執行完所獲得值將賦給THINGS_TO_EAT.

#語句區塊內的函數宣告

切勿在語句區塊內宣告函數,在ECMAScript 5 的嚴格模式下,這是不合法的。函數宣告應該在作用域的頂層。但在語句區塊內可將函數申明轉換為函數表達式賦值給變數。

不推薦

if (x) {
  function foo() {}
}
登入後複製

推薦

if (x) {
  var foo = function() {};
}
登入後複製

不要使用eval函數

eval() 不只混淆語境還很危險,總會有比這更好、更清晰、更安全的另一種方案來寫你的程式碼,因此盡量不要使用eval 函數。

陣列和物件字面量

1.用陣列和物件字面量來取代陣列和物件建構器。陣列構造器很容易讓人在它的參數上犯錯。

不推薦

//数组长度3
var a1 = new Array(x1, x2, x3);
//数组长度2
var a2 = new Array(x1, x2);

//如果x1是一个自然数,那么它的长度将为x1
//如果x1不是一个自然数,那么它的长度将为1
var a3 = new Array(x1);

var a4 = new Array();
登入後複製

正因如此,如果將程式碼傳參從兩個變成一個,那陣列很有可能發生意料不到的長度變化。為避免此類怪異狀況,請始終採用可讀的數組字面量。

推薦

#
var a = [x1, x2, x3];
var a2 = [x1, x2];
var a3 = [x1];
var a4 = [];
登入後複製

2.对象构造器不会有类似的问题,但是为了可读性和统一性,我们应该使用对象字面量。

不推荐

var o = new Object();

var o2 = new Object();
o2.a = 0;
o2.b = 1;
o2.c = 2;
o2['strange key'] = 3;
登入後複製

推荐

var o = {};
var o2 = {
  a: 0,
  b: 1,
  c: 2,
  'strange key': 3
};
登入後複製

三元条件判断(if 的快捷方法)

用三元操作符分配或返回语句。在比较简单的情况下使用,避免在复杂的情况下使用。没人愿意用 10 行三元操作符把自己的脑子绕晕。

不推荐

if(x === 10) {
  return 'valid';
} else {
  return 'invalid';
}
登入後複製

推荐

return x === 10 ? 'valid' : 'invalid';
登入後複製

for循环

使用for循环过程中,数组的长度,使用一个变量来接收,这样有利于代码执行效率得到提高,而不是每走一次循环,都得重新计算数组长度

不推荐

for(var i=0;i<arr.length,i++){

}
登入後複製

推荐

for(var i=0,len=arr.length;i<len,i++){

}
登入後複製

重复的dom操作

重复的dom操作,使用一个变量来进行接收很有必要,而不是频繁的去操作dom树,这对性能与代码的整洁及易维护性带来不好的影响

不推荐

$(&#39;.myp&#39;).find(&#39;.span1&#39;).text(&#39;1&#39;);
$(&#39;.myp&#39;).find(&#39;.span2&#39;).text(&#39;2&#39;);
$(&#39;.myp&#39;).find(&#39;.span3&#39;).text(&#39;3&#39;);
$(&#39;.myp&#39;).find(&#39;.span4&#39;).text(&#39;4&#39;);
登入後複製

推荐

var myp=$(&#39;.myp&#39;);
myp.find(&#39;.span1&#39;).text(&#39;1&#39;);
myp.find(&#39;.span2&#39;).text(&#39;2&#39;);
myp.find(&#39;.span3&#39;).text(&#39;3&#39;);
myp.find(&#39;.span4&#39;).text(&#39;4&#39;);
登入後複製

在jquery .end()可使用的情况下应该优先使用.end()

推荐

$(&#39;.myp&#39;).find(&#39;.span1&#39;).text(&#39;1&#39;)
           .end().find(&#39;.span2&#39;).text(&#39;2&#39;);
           .end().find(&#39;.span3&#39;).text(&#39;3&#39;);
           .end().find(&#39;.span4&#39;).text(&#39;4&#39;);
登入後複製

注释规范

在描写注释时,推荐格式化且统一的注释风格,在写注释时尽量描述写代码时的思路,而不是代码做了什么。

不推荐

//获取订单
function getOrderByID(id){
    var order;
    //...
    return order;
}
登入後複製

方法的注释应该统一用块级注释

推荐

/**
 * 根据订单id获取订单详细数据
 * @param  {[number]} id [订单ID]
 * @return {[order]}    [订单详细信息]
 */
function getOrderByID(id){
    var order;
    //...
    return order;
}
登入後複製

以上就是JavaScript-总结常用代码书写规范的内容,更多相关内容请关注PHP中文网(www.php.cn)!



來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板