OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Node.JS编码规范指南教程:教你优雅地写JavaScript代码


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1416383295764
注意 转载须保留原文链接,译文链接,作者译者等信息。  
注* 仅供参数

这是用于书写一致性和优美的node.js代码的指南教程。它由社区维护并在社区内流行,参考了一些人的意见。

我们维护了一个.jshintrc来强制执行这些规则(自动格式化参数配制)。您可以使用并进行调整,或者编写自己的脚本。

本指南是由费利克斯Geisendörfer创建,并遵守CC BY-SA3.0许可授权。我们鼓励您根据自己的喜好进行调整。


2个空格的缩进


使用2个空格进行缩进,永远也不要使用混合的tab和空格作为缩进。

换行


使用Unix风格的换行,每行结尾以(\n)结束,永远不要使用Windows的换行符(\r\n)。

无拖尾空白


永远也不要在一行后面留空格,在提交之前,你要像每顿饭刷牙一样清理你的JS文件。否则,腐烂的气味会驱走贡献者或同事。

使用分号


根据科学研究,分号的使用是我们社会的核心价值。考虑一下反对派的观点 ,但是我们需要传统,不要滥用纠错机制(省略分号)。

注* 在JavaScript中前置逗号代码风格和省略分号一直存在争论,下同。

每行最多80个字符


每行最多80个字符。是的,屏幕在最近几年越来越大,但是你的脑子没怎么变,你可以使用多余的空间用来分屏。

使用单引号


只有在JSON文件中才使用双引号


Right:

var foo = 'bar';


Wrong:

var foo = "bar";


注* 为什么? JavaScript中包含双引号的字符串几乎到处都是,这样你就不需要转义了。


在同一行写大括号



Right:

if (true) {
  console.log('winning');
}

Wrong:

if (true)
{
  console.log('losing');
}

同样,注意在条件前后都加个空格。


方法链(调用链)


如果你使用方法链,确保每行只调用一个方法。

同时你要合理使用缩进来表示他们的父对象是一致的。


Right:

User
  .findOne({ name: 'foo' })
  .populate('bar')
  .exec(function(err, user) {
    return true;
  });



Wrong:

User
.findOne({ name: 'foo' })
.populate('bar')
.exec(function(err, user) {
  return true;
});
User.findOne({ name: 'foo' })
  .populate('bar')
  .exec(function(err, user) {
    return true;
  });
User.findOne({ name: 'foo' }).populate('bar')
.exec(function(err, user) {
  return true;
});
User.findOne({ name: 'foo' }).populate('bar')
  .exec(function(err, user) {
    return true;
});


每行声明一个变量


每个var只声明一个变量,它可以更容易地重新排序。但是,并且变量应该在更有意义的地方声明。

Right:

var keys   = ['foo', 'bar'];
var values = [23, 42];
var object = {};
while (keys.length) {
  var key = keys.pop();
  object[key] = values.pop();
}


Wrong:

var keys = ['foo', 'bar'],
    values = [23, 42],
    object = {},
    key;
while (keys.length) {
  key = keys.pop();
  object[key] = values.pop();
}



使用首字母小写给变量属性和函数命名


变量,属性和函数名应该使用lowerCamelCase(首字母小写)。他们也应该是描述性的。一般应避免单字符变量和不常见的缩写。

Right:

var adminUser = db.query('SELECT * FROM users ...');

Wrong:

var admin_user = db.query('SELECT * FROM users ...');


类名首字母大写


类名的首字母应该是大写的

Right:

function BankAccount() {
}

Wrong:

function bank_Account() {
}


常量大写



常量应该被声明为普通变量或静态类的属性,全部使用大写字母。

Node.js/V8实际上支持Mozilla的const的扩展,但遗憾的是不能用于类成员,也不是任何ECMA标准的一部分。

Right:

var SECOND = 1 * 1000;

function File() {
}
File.FULL_PERMISSIONS = 0777;

Wrong:

const SECOND = 1 * 1000;

function File() {
}
File.fullPermissions = 0777;


Object / Array 声明


使用尾随逗号,把短的声明在一行:

Right:

var a = ['hello', 'world'];
var b = {
  good: 'code',
  'is generally': 'pretty'
};

Wrong:

var a = [
  'hello', 'world'
];
var b = {"good": 'code'
        , "is generally": 'pretty'
        };


使用 === 操作符


编写不应该只记事规则,还要学会使用。

Right:

var a = 0;
if (a !== '') {
  console.log('winning');
}

Wrong:

var a = 0;
if (a == '') {
  console.log('losing');
}

注* === 即会判断类型,又会判断结果。


使用多行三元运算符


三元运算符不应该用在一行。分割成多行来代替。

Right:

var foo = (a === b)
  ? 1
  : 2;

Wrong:

var foo = (a === b) ? 1 : 2;



不要扩展内置对象



不要扩展原生JavaScript对象的原型。以后会后悔的。


Right:

var a = [];
if (!a.length) {
  console.log('winning');
}


Wrong:

Array.prototype.empty = function() {
  return !this.length;
}
var a = [];
if (a.empty()) {
  console.log('losing');
}


注* 扩展String.prototype是比较常见的,如format, trim。



使用描述性的条件


任何判断条件应该分配给一个描述性命名的变量或函数:

Right:

var isValidPassword = password.length >= 4 && /^(?=.*\d).{4,}$/.test(password);

if (isValidPassword) {
  console.log('winning');
}


Wrong:

if (password.length >= 4 && /^(?=.*\d).{4,}$/.test(password)) {
  console.log('losing');
}


写小而短的函数


保持你的函数短一点。对一个大房间的最后一排的人民群众而言可以轻松读取幻灯片上的代码是比较合适的。不要指望他们有的视力保持每个函数〜15行代码。


早点从函数返回


为了避免if语句的深层嵌套,总是尽可能早地在函数返回值。


Right:

function isPercentage(val) {
  if (val < 0) {
    return false;
  }
  if (val > 100) {
    return false;
  }
  return true;
}


Wrong:

function isPercentage(val) {
  if (val >= 0) {
    if (val < 100) {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}


命名您的闭包


随时给你闭包名称。这表明你关心他们,并能产生更好的堆栈跟踪,heap和cpu profiles。

Right:

req.on('end', function onEnd() {
  console.log('winning');
});

Wrong:

req.on('end', function() {
  console.log('losing');
});


不要嵌套闭包


使用闭包,但不能嵌套他们。否则,你的代码会变得一团糟。

Right:

setTimeout(function() {
  client.connect(afterConnect);
}, 1000);
function afterConnect() {
  console.log('winning');
}


Wrong:

setTimeout(function() {
  client.connect(function() {
    console.log('losing');
  });
}, 1000);



使用斜线注释


使用斜线为单行和多行注释。尝试从更高层次说明你代码的意图。不要重申琐碎的事情。


Right:

// 'ID_SOMETHING=VALUE' -> ['ID_SOMETHING=VALUE', 'SOMETHING', 'VALUE']
var matches = item.match(/ID_([^\n]+)=([^\n]+)/));
// This function has a nasty side effect where a failure to increment a
// redis counter used for statistics will cause an exception. This needs
// to be fixed in a later iteration.
function loadUser(id, cb) {
  // ...
}
var isSessionValid = (session.expires < Date.now());
if (isSessionValid) {
  // ...
}


Wrong:

// Execute a regex
var matches = item.match(/ID_([^\n]+)=([^\n]+)/));
// Usage: loadUser(5, function() { ... })
function loadUser(id, cb) {
  // ...
}
// Check if the session is valid
var isSessionValid = (session.expires < Date.now());
// If the session is valid
if (isSessionValid) {
  // ...
}

禁止使用: Object.freeze, Object.preventExtensions, Object.seal, with, eval


这些功能很可笑,远离他们。

注* 类似Java/C#中的protected / private / seal / final。



原文地址: 点此
社区评论 ( Beta版 )
  • #0 己删除 1416389361497
  • #1 易妇牛 1416447887589

    有很多都不是很赞同。

  • #2 易妇牛 1416447928487

    关于javascript的文章越来越少了啊!注意了

  • #3 ourjs 1416448071101

    @易妇牛 #2

    欢迎分享贡献

  • #4 吕尘寺 1416457858860

    赞一下

  • #5 Redstone 1416471814642

    非常好。不过我需要根据这个规范转成一个coffee的规范。

  • #6 关仗见 1416492984859

    Object / Array 声明处,正确写法中有错误,那个b的对象多一个“,”这样会导致网页错误,在IE6的浏览器下。

  • #7 ourjs 1416524420326

    @关仗见 #6

    确实如此,已经更正,这位小哥可在原文github上提一个pull request。

  • #8 席米仰 1438653846218

    @ourjs #7

    额 他这个是nodejs的。。。。不管ie

  • #9 姜王勺 1475893380406

    禁止使用: Object.freeze, Object.preventExtensions, Object.seal, with, eval

    这是为什么?

  • #10 卫他任 1487575905026

    不要扩展内置对象这一条有点以偏概全了吧?只要做好兼容的话,自己写扩展方法也是一种很好的选择。如扩展Array的forEach方法: Array.prototype.forEach=Array.prototype.forEach||function(...) {...自己的扩展方法}

    除非有专定烂代码爱好的人,上面的函数在很多场合都正常使用

OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. Nginx的大计划:将原生支持JavaScript
  2. NodeJS会是昙花一现吗?
  3. Go语言实例教程基础语法篇(一)
  4. Google收购Firebase,Fire加入谷歌云平台
  5. 理解JavaScript中的事件路由冒泡过程及委托代理机制
  6. SpiderMonkey的JavaScript引擎[Firefox]性能超越V8[Chrome]
  7. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  8. JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
  9. 基于HTML5和JavaScript实现的Winamp MP3播放器
  10. 15个最好用的Node.JS后端框架
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
  2. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  3. 理解JavaScript中的事件路由冒泡过程及委托代理机制
  4. 用JavaScript制作HTML5动画基础
  5. Node.js 包教不包会
  6. 使用Javascript开发OS X应用程序
  7. Node程序中的设计模式
  8. 制作canvas游戏
  9. 5个经典的前端面试问题
  10. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?

 关键字 - Node.JS
  1. node.js使用unzip解压zip包指定文件,提取 word/excel (docx/pptx/xlsx) 文本内容
  2. Node.JSv8的5个新特性:支持string padding与async/await和object参数省略
  3. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  4. node.js中fs.stat里的atime,mtime,ctime,birthtime在debian下的更新规则与区别
  5. NodeJS的DNS使用:域名解析,MX记录查询,SPF反垃圾邮件测试
  6. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  7. 是什么让Node.js比Java更快?为什么NodeJS这么快?
  8. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  9. 利用Windows注册表将你的Node.JS程序添加到右健菜单直接运行
  10. Node.js中的通用基础设计模式

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号