JavaScript学习笔记

JavaScript -- 代码规范

2016-11-18  本文已影响1189人  ghwaphon
  1. 使用制表符进行缩进,推荐使用 4 个空格字符作为一个缩进层级。

  2. 建议每条语句以分号结尾,虽然 JavaScript 有自动分号插入(ASI) 机制,但是它的插入规则非常复杂难以记住,所以不推荐省略分号。

  3. 为了代码的可读性,建议将一行代码的长度保持在 80 字符以内。

  4. 当代码达到了单行最大字符限制时,需要将代码手动拆成两行,通常在元算符换行的时候,下一行最好增加两个层级的缩进。

     callFunction(elementOne, elementTwo, elementThree, elementFour,
             elementFive);
    

而且最好将一个运算符放置到行尾,这样的话,ASI 就不会自作主张的在行尾添加分号,也就避免了错误的发生。当然如果是在给变量赋值的时候换行,那么第二行的位置应当和赋值运算符的位置保持对齐。

        var result = elementOne + elementTwo + elementThree +
                     elementFive;
  1. 合理的使用空行将让你的代码更加易于阅读。在以下场景中添加空行是非常不错的主意。
    • 在方法之间
    • 在方法中的局部变量和第一条语句之间
    • 在单行或多行注释之前
    • 在方法的逻辑片段之间

下面是以上原则的实践。
if (true) {

            for (var i = 0; i < Things.length; i++) {
                var p = 1,
                    q = 2;

                if (true) {
                    
                }
            }
        }
  1. 命名是一门艺术,更是一门技术,通常来讲命名长度应当尽可能的短,并且抓住要点。为变量命名时,其前缀应该是名词。为函数命名时前缀应当是动词,比如 can, has, is, set, get 等。对于常量的命名,最好使用大写字母和下划线的组和来命名,比如说 MAX_LENGTH

  2. null 是一个特殊值,但是千万不要和 undefined 搞混,在下列场景中应当使用 null

    • 用来初始化一个变量,这个变量可能赋值为一个对象。
      var person = null;

    • 用来和一个已经初始化的变量比较,这个变量可以是也可以不是一个对象。
      var person = getPerson();

        if (person !== null) {  
            doSomething();
        }
      
    • 当函数的参数期望是对象时,用作参数传入。
      function printPerson(person) {
      if (person !== null) {

                // print person
            }
        }
      
        printPerson(null);
      
    • 当函数的返回值期望是对象时,用作返回值传出。
      function getPerson() {
      if (condition) {
      return new Person("Hwaphon");
      } else {
      return null;
      }
      }

  3. 我们通常将 undefinednull 搞混, 那是因为 undefined == null 的结果是 true, 然而这二者的用途却各有不同。那些没有被初始化的变量都有一个初始值,即 defined, 表示这个变量等待被赋值。有一点值得注意的是,用 typeof 去检测变量,如果这个变量声明了没有初始化会返回 undefined, 二如果这个变量根本就没声明也会返回 undefined
    var person;

         console.log(typeof person); // undefined
         console.log(typeof animal); // undefined 
    
  4. JavaScrtipt 支持两种不同类型的注释,单行注释和多行注释。关于单行注释,有三种使用方式。

    • 独占一行的注释,用来解释下一行代码。这行注释之前总是有一个空行,且缩进层级和下一行代码保持一致。
      if (condition) {

           // This is a single line comment
           doSomething();
       }
      
    • 在代码行的尾部进行注释。 代码结束到注释之间至少有一个缩进。注释(包括之前的代码部分)不应该超过但行的最大字符数( 80 ) 限制,如果超过了,就将这条注释放置于当前代码行的上方。
      if (condition) {
      doSomething(); // This is a single line comment
      }

    • 被注释掉的是一大段代码。
      // if (condition) {
      // doSomething();
      // }

关于多行注释,,是通过 /* */ 来实现的,不过最好还是使用下面这样的风格实现多行注释。
/*
* First line
* Second line
* Third line
*/
至于什么时候使用注释,有一条指导原则,当代码不够清晰时添加注释,而当代码很明了时不应当添加注释。在以下情况会最好添加注释。

  1. 使用 if 或者 for 语句时,不论块语句包含多行代码还是单行代码,都应当使用花括号。

  2. switch 语句中, 尽量不要使用 case 语句的连续执行,如果非要使用的话,最好添加注释。至于 default, 即使其什么都不做,最好也不腰省略,比如下面这样。
    switch(condition) {
    case "first":
    break;

            case "second":
                break;
    
            default:
                // no logic here
        }
    
  3. 尽量不要使用 continue, 用 if 语句替代 continue 的功能。

  4. for-in 循环是用来遍历对象属性的,可是存在一个问题,它不仅遍历对象的实例属性,同样还遍历从原型继承来的属性。 所以最好使用 hasOwnProperty() 方法来为 for-in 循环过滤出实例属性。

  5. 推荐在函数顶部使用单 var 语句声明接下来可能会使用到的变量,而且没有初始值的变量应该出现在 var 语句的尾部。

  6. 推荐先声明函数再使用函数。

  7. 不推荐使用全局的严格模式,推荐使用局部的严格模式。

  8. CSSJavaScript 中分离,当需要通过 JavaScript 来修改元素样式的时候,最佳的方法是操作 CSSclassName
    // original style
    element.className += " className";

        // HTML5 style
        element.classList.add("className");
    
  9. JavaScriptHTML 中抽离。可以自己创造一个 addListener() 函数添加行为,而不是在 HTML 结构中使用 onclick 之类的内嵌 JavaScript 代码。
    function addListener(target, type, handler) {
    if (target.addEventListener) {
    target.addEventListener(type, handler, false);
    } else if(target.attachEvent) {
    target.attachEvent("on" + type, handler);
    } else {
    target["on" + type] = handler;
    }
    }

  10. typeof 检测原始值, 用 instanceof 检测引用值。 在使用这两个运算符的时候不要加括号,那样会让它们看起来像函数。检测函数最好使用 typeof,下面是检测数组的一种方法。
    function isArray(value) {
    if (typeof Array.isArray === "function") {
    return Array.isArray(value);
    } else {
    return Object.prototype.toString.call(value) === "[object Array]";
    }
    }

  11. 对于一个对象,如果你想检测某个属性是否存在,有以下两种方式。
    var person = {
    name: "hwaphon",
    age: 21
    };

        // Example one
        if ("name" in person) {
            console.log("Exsits");
        }
    
        // Example two
        if (person.hasOwnProperty("name")) {
            console.log("Exsits");
        }
上一篇下一篇

猜你喜欢

热点阅读