Javascript编码规范

1. 缩进

  • 永远不要混用空格和Tab。
  • 为了可读性,部门统一建议使用2个空格宽度的缩进。

2. 语法

A. 变量命名

当创建变量时,建议在变量名前加上一个字母以表示该变量的类型,如:

var sName = 'test';   // 表示String类型
var nAge = 18;        // 表示Number类型
var bShow = true;     // 表示Bool类型
var aSkill = ['skill1', 'skill2', 'skill3'];     // 表示Array类型
var fRun = funtion() {};        // 表示Function类型
var rTmp = new RegExp('e', 'g');        // 表示RegExp类型
var oData = {};           // 表示Object类型

另外,在命名时,还需要注意下面几点:

  1. 所有命名最好使用英语表示。
  2. 所有变量名应该明确而必要,尽量避免不必要的容易混淆的缩写。
  3. 对应的方法应该使用对应的动词,例如: get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end。
  4. 尽量避免复杂的条件语句,可以使用临时的boolean变量代替
  5. 不要在代码中重复使用有意义的数字,数字无法说明自身,请用变量代替。常量的形式如: NAMES_LIKE_THIS, 命名使用大写字符, 并用下划线分隔。
  6. 模块内dom对象,带$符号前缀,例如:$dom

B. js格式规范

  1. 操作符前后要保留1个空格,提升代码可读性,每行代码结束添加分号。
var nBase = 7;
var nNum = nBase + 1;
  1. 使用括号和空格来提升可读性
  • if/for/try等判断语句通常都有小括号、花括号和多行,建议换行
  // 错误的例子
  if(condition) doSomething();

  // 正确的例子
  if (nBase > nNum) {
    // 语句
  } else {
    // 语句
  }
  for (var i = 0, len = 100; i < len; i++) {
    // 语句
  }
  1. 同一个方法中或闭包中,变量定义统一在顶部
  // 错误的例子
  var a = 1;
  a = a - 1;
  var b = 2;
  b = a - 2;

  // 正确的例子
  var a = 1;
  var b = 2;
  a = a - 1;
  b = a - 2;
  1. 单引号 (') 优于双引号 ("),尤其是当你创建一个包含 HTML代码的字符串,所以在项目中要统一引号的使用,并保持一致。
  var str = 'test';
  1. 提前返回函数结果,提升代码的可读性
  // 不好:
  function returnLate( foo ) {
   var ret;
   if ( foo ) {
      ret = "foo";
   } else {
      ret = "quux";
   }
   return ret;
  }
  // 好:
  function returnEarly( foo ) {
    if ( foo ) {
      return "foo";
    }
    return "quux";
  }

C. js变量类型检测和转换

  1. 判断类型
  // String:
  typeof variable === 'string'
  // Number:
  typeof variable === 'number'
  // Boolean:
  typeof variable === 'boolean'
  // Object:
  typeof variable === 'object'
  // Array: (如果可能的话)
  Array.isArray( arrayLikeObject )
  // Node:
  elem.nodeType === 1
  // null:
  variable === null
  // null or undefined:
  variable == null

  // undefined:
  // a.全局变量
  typeof variable === 'undefined'
  // b.局部变量
  variable === undefined
  // c.属性
  object.prop === undefined
  object.hasOwnProperty(prop)
  'prop' in object
  1. 转换类型
  * -> Number:
  nTmp = +sTmp;
  * -> String:
  sTmp = nTmp + ‘’;
  * -> Bool:
  bTmp = !!oTmp;
  1. 取整
  var num = 2.5;
  parseInt( num, 10 );
  // 等价于...
  ~~num;
  // 去除变量中的英文
  parseInt('25px'); // 25

D. 判断

// 当只是判断一个 array 是否有长度:
if ( array.length ) ...
// 当只是判断一个 array 是否为空:
if ( !array.length ) ...
// 当只是判断一个 string 是否为空:
if ( !string ) ...
// ...需要注意的是:这个将会匹配 0, ’’, null, undefined, NaN
// 如果你 _必须_ 是布尔类型的 false,请这样用:
if ( foo === false ) ...

// 但注意下面的值都返回 true:
'0' 字符串0
[] 空数组
{} 空对象

3. 闭包示例

在日常的项目中,我们通常会使用统一的闭包格式,需要注意下面几点:

  1. 通常我们把交互中使用的元素缓存到ui对象中以提高性能,特别是需要多次调用的元素。
  2. 在oPage模块中, init主要用于初始化程序,view和listen通常分别用于处理界面的初始化和事件绑定。
  3. 在闭包中,统一使用self指代this。
  (function ($) {
    var ui = {
      $pageWrap: $('#page-wrap'),
      $btnConfirm: $('#btn-confirm')
    };
    var oPage = {
      init: function() {
        this.view();
        this.listen();
      }, 
      view: function() {
        var self = this;
        ui.$pageWrap.show();
      },
      listen: function() {
        var self = this;
        //关闭弹窗
        ui.$btnConfirm.on('click', function(){
          self.fHidePage();
        });
      }, 
      fHidePage: function() {
        var self = this;
        ui.$pageWrap.hide();
      }
    };
    oPage.init();
  })($);

4. js使用class选择器时,class要单独加前缀“js-”,例如:“js-main”,避免与css样式使用同样类名。

  <div class="main js-main"></div>

  $main = $('.js-main');

5. 事件绑定

a. 禁止直接用onxxx绑定事件,如:

document.onclick = function(e){
  // do something
}

b. 在使用jQuery的项目中,建议使用on()的实现事件绑定或代理。

$(document).on('click', '.btn', function(e) {
  // do something
});

c. 若项目采用纯原生js开发,建议使用addEventListener实现事件代理和绑定。

window.addEventListener('click', function(e) {
  // do something
}, false);

6. ajax规范

在前后端合作的项目中基本都会用到ajax请求数据,通常我们使用jQuery库,以实现更便捷的ajax操作和模拟数据请求。
a. 通常在index.html下声明以下对象,oData存储一些程序中可能会修改的变量,如倒计时的时间;oUrl存储后端数据接口的地址,如下发抽奖的地址。

window.oPageConfig = {
  oUrl: {
    sLottery: '/lottery'
  }, 
  oData: {
    nLotteryTimes: 60
  }
}

b. 通常我们与后端约定的数据包含交互格式如下:

var msg = {
  code: 0, 
  message: 'success',
  data: {
    id: 7,
    name: 'prize'
  }
};

其中,当code == 0则表示请求成功,此时data对象中会包含所需的数据,若code != 0,message则会返回失败的原因。

$.ajax({
  type: 'get',
  data: {},
  dataType : 'JSON',
  url: window.oUrl.lottery
}).done(function (msg){
  if (0 == msg.code) {
    // code == 0 表示成功
  }else{
    // code != 0 表示请求失败
  };
});

7. ajax数据模拟规范

统一使用http://rap.imeete.com ,用户名指域账号,密码自己设置。

  • 使用之前进行host绑定,192.168.136.105 rap.imeete.com
  • 如果未开通,请找王春青

8. 注释

a. 代码应添加必要的注释,注释有意义且易懂
b. 在每个js文件头部插入以下注释,便于后期快速了解js文件所包含的功能和负责人。

/* ==========================================================
* xxx.js v201xMMDD
* ==========================================================
* by xxx
*
* 1、功能1
* 2、功能2
* ========================================================== */

c.函数注释方式如下:

/**
 * 取消事件
 *
 * @param {Element} el dom元素
 * @param {String} event 事件
 * @param {Boolean} cb 冒泡
 * @param {Number} type 类型,可选1(上线),2(下线)
 */
export function off(el, event, cb = false) {
  el.removeEventListener(event, cb);
}

9. 后台项目

项目结构

待更新

代码结构

待更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容