本文转自我司的编码规范~

====

引言

将要叙述的这些原则旨对javascript开发的风格做指导,并非指定性的规则需绝对服从。如果需要找出一条必须遵循的原则,应该是保持代码的一致性和风格统一

除去对代码的可读性、可维护性有益外,同时可以减少很多代码提交解决冲突合并时产生的不必要的麻烦。

代码风格

空格

  • 不要混用tab 和 空格.
  • 在开始项目编码之前制定缩进规则,使用空格缩进还是tab缩进,并且严格贯彻下去。
    • 建议统一使用空格缩进(2spaces),使用编辑器的设置tab键为空格空进以强制执行。
  • 如果你的编辑器支持设置“显示隐藏字符”的话,建议打开它。好处在于:
    • 强制代码格式统一
    • 去除行尾空字符
    • 去除空行空字符Eliminating blank line whitespace
    • 代码提交比较差异时更方便阅读

Syntax美化

Syntax美化包括空格的规则、换行的规则,以及其他语法层面上的书写格式,以方便阅读为准。可以使用编辑器的格式化插件来达到格式美化的目的,项目开发人员需要统一插件格式的规则,以避免提交代码时格式不统一而产生的不必要的麻烦。

[插件https://github.com/akalongman/sublimetext-codeformatter|SublimeText Code Formatter](https://github.com/akalongman/sublimetext-codeformatter|SublimeText Code Formatter)

语言规则

变量

  • 声明变量时应该使用var。不这样做会得到全局变量,从而污染了全局命名空间。
  • 使用一个 var 以及新行声明多个变量,缩进4个空格
  • 最后再声明未赋值的变量,当以后你想给一个依赖之前已赋值变量的变量时很有用。
  • 不一定严格按照只是用一个var声明变量的规则,可以按照变量的相关性分组声明。
  1. var items = getItems(),
  2. goSportsTeam = true,
  3. dragonball,
  4. length,
  5. i;
  • 在作用域顶部声明变量,避免变量声明和赋值引起的相关问题。
  1. // bad
  2. function() {
  3. test();
  4. console.log('doing stuff..');
  5. //..other stuff..
  6. var name = getName();
  7. if (name === 'test') {
  8. return false;
  9. }
  10. return name;
  11. }
  12. // good
  13. function() {
  14. var name = getName();
  15. test();
  16. console.log('doing stuff..');
  17. //..other stuff..
  18. if (name === 'test') {
  19. return false;
  20. }
  21. return name;
  22. }
  23. // bad
  24. function() {
  25. var name = getName();
  26. if (!arguments.length) {
  27. return false;
  28. }
  29. return true;
  30. }
  31. // good
  32. function() {
  33. if (!arguments.length) {
  34. return false;
  35. }
  36. var name = getName();
  37. return true;
  38. }

函数

  • 不要在块内定义functions。
  1. //Do not do this:
  2. if (x) {
  3. function foo() {}
  4. }
  5. //Do this
  6. var foo;
  7. if(x) {
  8. foo = function(){};
  9. }
  • 函数表达式:
  1. // 匿名函数表达式
  2. var anonymous = function() {
  3. return true;
  4. };
  5. // 有名函数表达式
  6. var named = function named() {
  7. return true;
  8. };
  9. // 立即调用函数表达式
  10. (function() {
  11. console.log('Welcome to the Internet. Please follow me.');
  12. })();
  • 绝对不要把参数命名为 arguments, 这将会逾越函数作用域内传过来的 arguments 对象.
  1. // bad
  2. function nope(name, options, arguments) {
  3. // ...stuff...
  4. }
  5. // good
  6. function yup(name, options, args) {
  7. // ...stuff...
  8. }

字符串

  • 对字符串使用单引号 '
  1. // bad
  2. var name = "Bob Parr";
  3. // good
  4. var name = 'Bob Parr';
  5. // bad
  6. var fullName = "Bob " + this.lastName;
  7. // good
  8. var fullName = 'Bob ' + this.lastName;
  • 超过80个字符的字符串应该使用字符串连接换行

  • 果过度使用,长字符串连接可能会对性能有影响.

  1. // bad
  2. var errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';
  3. // bad
  4. var errorMessage = 'This is a super long error that \
  5. was thrown because of Batman. \
  6. When you stop to think about \
  7. how Batman had anything to do \
  8. with this, you would get nowhere \
  9. fast.';
  10. // good
  11. var errorMessage = 'This is a super long error that ' +
  12. 'was thrown because of Batman.' +
  13. 'When you stop to think about ' +
  14. 'how Batman had anything to do ' +
  15. 'with this, you would get nowhere ' +
  16. 'fast.';

逗号

  • 不要将逗号放前面
  1. // bad
  2. var once
  3. , upon
  4. , aTime;
  5. // good
  6. var once,
  7. upon,
  8. aTime;
  9. // bad
  10. var hero = {
  11. firstName: 'Bob'
  12. , lastName: 'Parr'
  13. , heroName: 'Mr. Incredible'
  14. , superPower: 'strength'
  15. };
  16. // good
  17. var hero = {
  18. firstName: 'Bob',
  19. lastName: 'Parr',
  20. heroName: 'Mr. Incredible',
  21. superPower: 'strength'
  22. };
  • 不要加多余的逗号
  1. // bad
  2. var hero = {
  3. firstName: 'Kevin',
  4. lastName: 'Flynn',
  5. };
  6. var heroes = [
  7. 'Batman',
  8. 'Superman',
  9. ];
  10. // good
  11. var hero = {
  12. firstName: 'Kevin',
  13. lastName: 'Flynn'
  14. };
  15. var heroes = [
  16. 'Batman',
  17. 'Superman'
  18. ];

分号

  • 语句结束一定要加分号
  1. // bad
  2. (function() {
  3. var name = 'Skywalker'
  4. return name
  5. })()
  6. // good
  7. (function() {
  8. var name = 'Skywalker';
  9. return name;
  10. })();
  11. // good
  12. ;(function() {
  13. var name = 'Skywalker';
  14. return name;
  15. })();

类型转换

  • 在语句的开始执行类型转换.
  • 字符串:
  1. // => this.reviewScore = 9;
  2. // bad
  3. var totalScore = this.reviewScore + '';
  4. // good
  5. var totalScore = '' + this.reviewScore;
  • 对数字使用 parseInt 并且总是带上类型转换的基数.
  1. var inputValue = '4';
  2. // bad
  3. var val = new Number(inputValue);
  4. // bad
  5. var val = +inputValue;
  6. // bad
  7. var val = inputValue >> 0;
  8. // bad
  9. var val = parseInt(inputValue);
  10. // good
  11. var val = Number(inputValue);
  12. // good
  13. var val = parseInt(inputValue, 10);
  14. // with caution
  15. /**
  16. * parseInt was the reason my code was slow.
  17. * Bitshifting the String to coerce it to a
  18. * Number made it a lot faster. But it reduces the readability.
  19. */
  20. var val = inputValue >> 0;

相等性

  • 优先选择严格的 “ === ” 做相等性判断,但是当检查是否是undefined 或者 null时, 可以使用“ == ”。

命名规则

  • 避免单个字符名,让你的变量名有描述意义。变量一般用名词, 函数一般使用动词,若函数返回boolean则可以用is或者has开头。常量使用全大写以下划线链接。
  1. //good
  2. var PI = 3.1415926;
  3. // bad
  4. function q() {
  5. // ...stuff...
  6. }
  7. // good
  8. function query() {
  9. // ..stuff..
  10. }
  • 当命名对象、函数和实例时使用驼峰命名规则
  1. // bad
  2. var OBJEcttsssss = {};
  3. var this_is_my_object = {};
  4. var this-is-my-object = {};
  5. function c() {};
  6. var u = new user({
  7. name: 'Bob Parr'
  8. });
  9. // good
  10. var thisIsMyObject = {};
  11. function thisIsMyFunction() {};
  12. var user = new User({
  13. name: 'Bob Parr'
  14. });
  • 当命名构造函数或类时使用驼峰式大写
  1. // bad
  2. function user(options) {
  3. this.name = options.name;
  4. }
  5. var bad = new user({
  6. name: 'nope'
  7. });
  8. // good
  9. function User(options) {
  10. this.name = options.name;
  11. }
  12. var good = new User({
  13. name: 'yup'
  14. });
  • 命名私有属性时前面加个下划线
  1. // bad
  2. this.__firstName__ = 'Panda';
  3. this.firstName_ = 'Panda';
  4. // good
  5. this._firstName = 'Panda';
  • 当保存对 this 的引用时使用 _this
  1. // bad
  2. function() {
  3. var self = this;
  4. return function() {
  5. console.log(self);
  6. };
  7. }
  8. // bad
  9. function() {
  10. var that = this;
  11. return function() {
  12. console.log(that);
  13. };
  14. }
  15. // good
  16. function() {
  17. var _this = this;
  18. return function() {
  19. console.log(_this);
  20. };
  21. }

其他

  • Prefer this.foo = null than delete this.foo
  • 小心使用switch语句
  • 不要轻易扩展修改builtin类型的行为
  • 谨慎使用保留字作为object属性名(已经吃过亏了)
  • 避免使用with

参考资料

编写一致的符合习惯的javascript的更多相关文章

  1. dart --- 更符合程序员编程习惯的javascript替代者

    dart是google在2011年推出的一门语言,提供较为丰富的lib,并支持将代码转变为javascript,其demo code 和 demo app 也是以web前端代码来展示的. 其语言特性较 ...

  2. JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素

    一.现在我们在网站设计(三)的基础上,来编写about.html页面. 这个页面要用到的知识点是利用JavaScript和DOM实现选择性地显示和隐藏某些DIV about.html页面在前面我们为了 ...

  3. 编写更加稳定/可读的javascript代码

    每个人都有自己的编程风格,也无可避免的要去感受别人的编程风格--修改别人的代码."修改别人的代码"对于我们来说的一件很痛苦的事情.因为有些代码并不是那么容易阅读.可维护的,让另一个 ...

  4. 使用AmplifyJS和JQuery编写更好更优雅的javascript事件处理代码

    事件(或消息)是一种经常使用的软件设计模式.可以减少消息处理者和消息公布者的之间的耦合,比方J2EE里面的JMS规范.设计模式中的观察者模式(也叫公布/订阅模式).这对于javascript代码相同适 ...

  5. 读《编写高质量代码:改善JavaScript程序的188个建议》1

    建议3:减少全局变量污染 定义全局变量有3种方式: ❑在任何函数外面直接执行var语句. var f='value'; ❑直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中, ...

  6. 编写自己的代码库(javascript常用实例的实现与封装)[转]

    1.前言 因为公司最近项目比较忙,没那么多空余的事件写文章了,所以这篇文章晚了几天发布.但是这也没什么关系,不过该来的,总是会来的.好了,其他的不多说的,大家在开发的时候应该知道,有很多常见的实例操作 ...

  7. 《编写高质量代码:改善JavaScript程序的188个建议》学习小记(二)

    建议3:减少全局变量污染 1.把多个全局变量都追加在一个名称空间下,将显著降低与其他应用程序产生冲突的概率,应用程序也会变得更容易阅读. var My = {}; My.name = { " ...

  8. 读《编写高质量代码:改善JavaScript程序的188个建议》2

  9. 编写自己的代码库(javascript常用实例的实现与封装)

    https://segmentfault.com/a/1190000010225928

随机推荐

  1. 2018年UI设计趋势概览

    ​互联网产品的用户界面设计趋势是根据用户的不同需求而不断变化的.在仔细分析了过去几年用户界面设计的趋势和创新之后,我们可以发现其背后的一些规律,2018年UI界面设计的趋势如下. 渐变色 在过去的几年 ...

  2. pkg_config找不到库

    解决方法 假设libavutil默认安装时libavutil.pc安装到了 /usr/lib64/lib/pkgconfig/ 中,而 echo $PKG_CONFIG_PATH 结果中没有这个路径, ...

  3. 1.spring环境的搭建

    1.app.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...

  4. windows8.1 初体验

    昨天装了Win8.1,Office2013 由于是英文版的,需要装一下中文语言包,然后就能使用自带的微软拼音输入法了. 我喜欢双屏时的桌面背景,选择span时一张图片可以跨越2个屏幕,比win7的好. ...

  5. jquery 插入节点的方法

    方法 描述 示例 append() 向每个匹配的元素内部追加内容 HTML代码: <p>我想说:</p> jQuery代码: $("p").append(& ...

  6. C语言基础第二次作业

    PTA第一次作业 题目7-1  统计学生成绩 1.实验代码 #include<stdio.h> int main(void){ ,B=,C=,D=,E=,f; scanf("%d ...

  7. 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)

    传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...

  8. [docker]mesos集群的启动脚本

    宿主机的IP地址列表 mesos-lb:192.168.253.159 mesos-marathon:192.168.253.159 mesos-master:192.168.253.159 meso ...

  9. 功能强大的文件上传插件带上传进度-WebUploader

    WebUploader是由Baidu WebFE(FEX)团队开发的一个以HTML5/FLASH构建的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用老 ...

  10. 201709013工作日记--Android异步通信AsyncTask

    参考相关博客:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTas ...