js代碼規(guī)范

總體規(guī)范

  • switch 下的 case 和 default 必須增加一個縮進層級

  • 二元運算符兩側(cè)必須有一個空格讨彼,一元運算符與操作對象之間不允許有空格

      var a = !arr.length;
      a++;
      a = b + c;
    
  • 用作代碼塊起始的左花括號 {前必須有一個空格

  • if / else / for / while / function / switch / do / try / catch / finally關(guān)鍵字后蔗蹋,必須有一個空格

  • 在對象創(chuàng)建時,屬性中的:之后必須有空格吹害,:之前不允許有空格

      var obj = {
          a: 1,
          b: 2,
          c: 3
      };
    
      // bad
      var obj = {
          a : 1,
          b:2,
          c :3
      };
    
  • 函數(shù)聲明兔跌、具名函數(shù)表達式座享、函數(shù)調(diào)用中,函數(shù)名和(之間不允許有空格

  • ,;前不允許有空格

  • 在函數(shù)調(diào)用龄减、函數(shù)聲明项钮、括號表達式、屬性訪問希停、if / for / while / switch / catch 等語句中烁巫,() 和 [] 內(nèi)緊貼括號部分不允許有空格

      // good
    
      callFunc(param1, param2, param3);
    
      save(this.list[this.indexes[i]]);
    
      needIncream && (variable += increament);
    
      if (num > list.length) {
      }
    
      while (len--) {
      }
    
    
      // bad
    
      callFunc( param1, param2, param3 );
    
      save( this.list[ this.indexes[ i ] ] );
    
      needIncreament && ( variable += increament );
    
      if ( num > list.length ) {
      }
    
      while ( len-- ) {
      }
    
  • 單行聲明的數(shù)組與對象,如果包含元素宠能,{}[]內(nèi)緊貼括號部分不允許包含空格

  • 行尾不得有多余的空格

  • 運算符處換行時劲够,運算符必須在新行的行首

      // good
      if (user.isAuthenticated()
          && user.isInRole('admin')
          && user.hasAuthority('add-admin')
          || user.hasAuthority('delete-admin')
      ) {
          // Code
        }
    
      var result = number1 + number2 + number3
          + number4 + number5;
    
    
      // bad
        if (user.isAuthenticated() &&
          user.isInRole('admin') &&
          user.hasAuthority('add-admin') ||
          user.hasAuthority('delete-admin')) {
          // Code
        }
    
      var result = number1 + number2 + number3 +
          number4 + number5;
    
  • 在函數(shù)聲明余舶、函數(shù)表達式、函數(shù)調(diào)用、對象創(chuàng)建江咳、數(shù)組創(chuàng)建、for語句等場景中,不允許在,;前換行

      // good
        var obj = {
            a: 1,
            b: 2,
            c: 3
      };
    
      foo(
           aVeryVeryLongArgument,
          anotherVeryLongArgument,
          callback
      );
    
    
      // bad
        var obj = {
            a: 1
          , b: 2
          , c: 3
      };
    
      foo(
          aVeryVeryLongArgument
          , anotherVeryLongArgument
          , callback
      );
    
  • 不同行為或邏輯的語句集,使用空行隔開脾还,更易閱讀

  • 較復雜的邏輯條件組合,將每個條件獨立一行入愧,邏輯運算符放置在行首進行分隔荠呐,或?qū)⒉糠诌壿嫲催壿嫿M合進行分隔。

  • 建議最終將右括號 )與左大括號{ 放在獨立一行砂客,保證與 if 內(nèi)語句塊能容易視覺辨識。

     if (user.isAuthenticated()
         && user.isInRole('admin')
         && user.hasAuthority('add-admin')
         || user.hasAuthority('delete-admin')
     ) {
         // Code
     }
    
  • 按一定長度截斷字符串呵恢,并使用 + 運算符進行連接鞠值。

  • 分隔字符串盡量按語義進行,如不要在一個完整的名詞中間斷開渗钉。

  • 特別的彤恶,對于HTML片段的拼接,通過縮進鳄橘,保持和HTML相同的結(jié)構(gòu)声离。
    也可使用數(shù)組來進行拼接,相對 + 更容易調(diào)整縮進瘫怜。

      var html = [
         '<article>',
             '<h1>Title here</h1>',
             '<p>This is a paragraph</p>',
             '<footer>Complete</footer>',
         '</article>'
     ];
     html = html.join('');
    
  • 當參數(shù)過多時术徊,將每個參數(shù)獨立寫在一行上,并將結(jié)束的右括號 )獨立一行鲸湃。

  • 所有參數(shù)必須增加一個縮進赠涮。

      foo(
          aVeryVeryLongArgument,
          anotherVeryLongArgument,
          callback
      );
    

也可以按邏輯對參數(shù)進行組合。
最經(jīng)典的是baidu.format函數(shù)暗挑,調(diào)用時將參數(shù)分為“模板”和“數(shù)據(jù)”兩塊

    baidu.format(
        dateFormatTemplate,
        year, month, date, hour, minute, second
    );

當函數(shù)調(diào)用時笋除,如果有一個或以上參數(shù)跨越多行,應當每一個參數(shù)獨立一行炸裆。
這通常出現(xiàn)在匿名函數(shù)或者對象初始化等作為參數(shù)時垃它,如setTimeout函數(shù)等。

    setTimeout(
        function () {
            alert('hello');
        },
        200
    );

    order.data.read(
        'id=' + me.model.id, 
        function (data) {
            me.attchToModel(data.result);
            callback();
        }, 
        300
    );
  • 鏈式調(diào)用較長時采用縮進進行調(diào)整烹看。

     $('#items')
         .find('.selected')
         .highlight()
         .end();
    
  • 三元運算符由3部分組成国拇,因此其換行應當根據(jù)每個部分的長度不同,形成不同的情況惯殊。

     var result = thisIsAVeryVeryLongCondition
         ? resultA : resultB;
    
     var result = condition
         ? thisIsAVeryVeryLongResult
         : resultB;
    
  • 數(shù)組和對象初始化的混用贝奇,嚴格按照每個對象的 { 和結(jié)束 } 在獨立一行的風格書寫。

     var array = [
         {
             // ...
         },
         {
             // ...
         }
     ];
    

對于 if...else...靠胜、try...catch...finally等語句掉瞳,推薦使用在}號后添加一個換行 的風格毕源,使代碼層次結(jié)構(gòu)更清晰,閱讀性更好陕习。

  • 不得省略語句結(jié)束的分號
    在 if / else / for / do / while 語句中霎褐,即使只有一行,也不得省略塊{...}

  • 函數(shù)定義結(jié)束不允許添加分號

  • IIFE 必須在函數(shù)表達式外添加 (该镣,非 IIFE 不得在函數(shù)表達式外添加 (
    額外的 ( 能夠讓代碼在閱讀的一開始就能判斷函數(shù)是否立即被調(diào)用冻璃,進而明白接下來代碼的用途。而不是一直拖到底部才恍然大悟损合。

命名

  • 變量 使用 Camel命名法

  • 常量 使用 全部字母大寫省艳,單詞間下劃線分隔 的命名方式

  • 類 使用 Pascal命名法

      function TextNode(options) {
      }
    
  • 類的 方法 / 屬性 使用 Camel命名法

     function TextNode(value, engine) {
         this.value = value;
         this.engine = engine;
     }
    
     TextNode.prototype.clone = function () {
         return this;
     }
    
  • 枚舉變量 使用 Pascal命名法,枚舉的屬性 使用 全部字母大寫嫁审,單詞間下劃線分隔 的命名方式

  • 由多個單詞組成的縮寫詞跋炕,在命名中,根據(jù)當前命名法和出現(xiàn)的位置律适,所有字母的大小寫與首字母的大小寫保持一致辐烂。

  • 由多個單詞組成的縮寫詞,在命名中捂贿,根據(jù)當前命名法和出現(xiàn)的位置纠修,所有字母的大小寫與首字母的大小寫保持一致

     function XMLParser() {
     }
    
     function insertHTML(element, html) {
     }
    
     var httpRequest = new HTTPRequest();
    
  • 類名 使用 名詞

  • 函數(shù)名 使用 動賓短語

  • boolean 類型的變量使用 is 或 has 開頭

  • Promise對象 用 動賓短語的進行時 表達

      var loadingData = ajax.get('url');
      loadingData.then(callback);
    

注釋

  • 單行注釋
    必須獨占一行。// 后跟一個空格厂僧,縮進與下一行被注釋說明的代碼一致扣草。

  • 多行注釋
    避免使用 /.../ 這樣的多行注釋。有多行注釋內(nèi)容時颜屠,使用多個單行注釋

  • 文檔化注釋
    為了便于代碼閱讀和自文檔化德召,以下內(nèi)容必須包含以 /*.../ 形式的塊注釋中

    文檔注釋前必須空一行
    自文檔化的文檔說明 what,而不是 how

  • 文件頂部必須包含文件注釋汽纤,用 @file 標識文件說明
    文件注釋中可以用 @author 標識開發(fā)者信息

  • 命名空間使用 @namespace 標識上岗。

示例:

    /**
     * @namespace
     */
    var util = {};

類和構(gòu)造函數(shù)

  • 使用 @class 標記類或構(gòu)造函數(shù)。
    解釋:
    對于使用對象 constructor 屬性來定義的構(gòu)造函數(shù)蕴坪,可以使用 @constructor 來標記肴掷。

示例:

    /**
     * 描述
     *
     * @class
     */
    function Developer() {
        // constructor body
    }
  • 使用 @extends 標記類的繼承信息。

示例:

    /**
     * 描述
     *
     * @class
     * @extends Developer
     */
    function Fronteer() {
        Developer.call(this);
        // constructor body
    }
    util.inherits(Fronteer, Developer);
  • 使用包裝方式擴展類成員時背传, 必須通過 @lends 進行重新指向.沒有 @lends 標記將無法為該類生成包含擴展類成員的文檔呆瞻。

示例:

    /**
     * 類描述
     *
     * @class
     * @extends Developer
     */
    function Fronteer() {
        Developer.call(this);
        // constructor body
    }

    util.extend(
        Fronteer.prototype,
        /** @lends Fronteer.prototype */{
            _getLevel: function () {
                // TODO
            }
        }
    );
  • 類的屬性或方法等成員信息使用 @public / @protected / @private 中的任意一個,指明可訪問性径玖。
    解釋:
    生成的文檔中將有可訪問性的標記痴脾,避免用戶直接使用非 public 的屬性或方法。

示例:

    /**
     * 類描述
     *
     * @class
     * @extends Developer
     */
    var Fronteer = function () {
        Developer.call(this);

        /**
         * 屬性描述
         *
         * @type {string}
         * @private
         */
        this._level = 'T12';

        // constructor body
    };
  util.inherits(Fronteer, Developer);

    /**
     * 方法描述
     *
     * @private
     * @return {string} 返回值描述
     */
      Fronteer.prototype._getLevel = function () {
    };
函數(shù)/方法注釋

函數(shù)/方法注釋必須包含函數(shù)說明梳星,有參數(shù)和返回值時必須使用注釋標識
參數(shù)和返回值注釋必須包含類型信息和說明

    // null 或 undefined

    // good
    if (noValue == null) {
      // ......
    }

    // bad
    if (noValue === null || typeof noValue === 'undefined') {
      // ......
    }
如果函數(shù)或全局中的 else 塊后沒有任何語句赞赖,可以刪除 else滚朵。
    // good
    function getName() {
        if (name) {
            return name;
        }

        return 'unnamed';
    }

    // bad
    function getName() {
        if (name) {
            return name;
        }
        else {
            return 'unnamed';
        }
    }
對循環(huán)內(nèi)多次使用的不變值,在循環(huán)外用變量緩存
    // good
    var width = wrap.offsetWidth + 'px';
    for (var i = 0, len = elements.length; i < len; i++) {
        var element = elements[i];
        element.style.width = width;
        // ......
    }


    // bad
    for (var i = 0, len = elements.length; i < len; i++) {
        var element = elements[i];
        element.style.width = wrap.offsetWidth + 'px';
        // ......
    }
對有序集合進行順序無關(guān)的遍歷時前域,使用逆序遍歷辕近。

解釋:
逆序遍歷可以節(jié)省變量,代碼比較優(yōu)化匿垄。

示例:

    var len = elements.length;
    while (len--) {
        var element = elements[len];
        // ......
    }

類型轉(zhuǎn)換檢測

  • 類型檢測優(yōu)先使用typeof移宅。對象類型檢測使用 instanceofnullundefined 的檢測使用 == null

  • 轉(zhuǎn)換成 string 時椿疗,使用 + ''漏峰。

示例:

    // good
    num + '';

    // bad
    new String(num);
    num.toString();
    String(num);
  • 轉(zhuǎn)換成 number 時,通常使用 +届榄。

示例:

    // good
      +str;

    // bad
    Number(str);
  • string 轉(zhuǎn)換成 number浅乔,要轉(zhuǎn)換的字符串結(jié)尾包含非數(shù)字并期望忽略時,使用 parseInt痒蓬。

示例:

    var width = '200px';
    parseInt(width, 10);
  • 使用 parseInt 時,必須指定進制滴劲。

示例:

    // good
    parseInt(str, 10);

    // bad
    parseInt(str);
  • 轉(zhuǎn)換成 boolean 時攻晒,使用 !!。

示例:

    var num = 3.14;
    !!num;
  • number 去除小數(shù)點班挖,使用 Math.floor / Math.round / Math.ceil鲁捏,不使用 parseInt。

示例:

    // good
    var num = 3.14;
    Math.ceil(num);

    // bad
    var num = 3.14;
    parseInt(num, 10);

字符串

  • 字符串開頭和結(jié)束使用單引號 '萧芙。
    解釋:
    輸入單引號不需要按住 shift给梅,方便輸入。
    實際使用中双揪,字符串經(jīng)常用來拼接 HTML动羽。為方便 HTML 中包含雙引號而不需要轉(zhuǎn)義寫法。
    示例:

      var str = '我是一個字符串';
      var html = '<div class="cls">拼接HTML可以省去雙引號轉(zhuǎn)義</div>';
    
  • 使用 數(shù)組 或 + 拼接字符串渔期。
    解釋:
    使用 + 拼接字符串运吓,如果拼接的全部是 StringLiteral,壓縮工具可以對其進行自動合并的優(yōu)化疯趟。所以拘哨,靜態(tài)字符串建議使用 + 拼接。
    在現(xiàn)代瀏覽器下信峻,使用 + 拼接字符串倦青,性能較數(shù)組的方式要高。
    如需要兼顧老舊瀏覽器盹舞,應盡量使用數(shù)組拼接字符串产镐。
    示例:

      // 使用數(shù)組拼接字符串
      var str = [
          // 推薦換行開始并縮進開始第一個字符串, 對齊代碼, 方便閱讀.
          '<ul>',
              '<li>第一項</li>',
              '<li>第二項</li>',
          '</ul>'
        ].join('');
    
      // 使用 + 拼接字符串
      var str2 = '' // 建議第一個為空字符串, 第二個換行開始并縮進開始, 對齊代碼, 方便閱讀
          + '<ul>',
          +    '<li>第一項</li>',
          +    '<li>第二項</li>',
          + '</ul>';
    

對象

  • 使用對象字面量 {} 創(chuàng)建新 Object隘庄。

示例:

    // good
    var obj = {};

    // bad
    var obj = new Object();
  • 對象創(chuàng)建時,如果一個對象的所有 屬性 均可以不添加引號磷账,則所有 屬性 不得添加引號峭沦。

示例:

    var info = {
        name: 'someone',
        age: 28
    };
  • 對象創(chuàng)建時,如果任何一個 屬性 需要添加引號逃糟,則所有 屬性 必須添加 '吼鱼。
    解釋:
    如果屬性不符合 Identifier 和 NumberLiteral 的形式,就需要以 StringLiteral 的形式提供绰咽。

示例:

    // good
      var info = {
        'name': 'someone',
        'age': 28,
        'more-info': '...'
    };

    // bad
    var info = {
        name: 'someone',
        age: 28,
        'more-info': '...'
    };
  • 不允許修改和擴展任何原生對象和宿主對象的原型菇肃。

示例:

    // 以下行為絕對禁止
    String.prototype.trim = function () {
    };
  • 屬性訪問時,盡量使用.取募。
    解釋:
    屬性名符合 Identifier 的要求琐谤,就可以通過 . 來訪問,否則就只能通過 [expr] 方式訪問玩敏。

  • 通常在 JavaScript 中聲明的對象斗忌,屬性命名是使用 Camel 命名法,用 . 來訪問更清晰簡潔旺聚。部分特殊的屬性(比如來自后端的JSON)织阳,可能采用不尋常的命名方式,可以通過 [expr] 方式訪問砰粹。

示例:

    info.age;
    info['more-info'];
  • for in 遍歷對象時, 使用 hasOwnProperty 過濾掉原型中的屬性唧躲。

示例:

    var newInfo = {};
    for (var key in info) {
        if (info.hasOwnProperty(key)) {
            newInfo[key] = info[key];
        }
    }

數(shù)組

使用數(shù)組字面量[]創(chuàng)建新數(shù)組,除非想要創(chuàng)建的是指定長度的數(shù)組碱璃。

示例:

    // good
    var arr = [];

    // bad
    var arr = new Array();
  • 遍歷數(shù)組不使用 for in弄痹。
    解釋:
    數(shù)組對象可能存在數(shù)字以外的屬性, 這種情況下 for in 不會得到正確結(jié)果.

示例:

    var arr = ['a', 'b', 'c'];
    arr.other = 'other things'; // 這里僅作演示, 實際中應使用Object類型

    // 正確的遍歷方式
      for (var i = 0, len = arr.length; i < len; i++) {
        console.log(i);
    }

    // 錯誤的遍歷方式
      for (i in arr) {
        console.log(i);
    }
  • 不因為性能的原因自己實現(xiàn)數(shù)組排序功能,盡量使用數(shù)組的 sort 方法嵌器。
    解釋:
    自己實現(xiàn)的常規(guī)排序算法肛真,在性能上并不優(yōu)于數(shù)組默認的 sort 方法。以下兩種場景可以自己實現(xiàn)排序:

  • 需要穩(wěn)定的排序算法爽航,達到嚴格一致的排序結(jié)果毁欣。
    數(shù)據(jù)特點鮮明,適合使用桶排岳掐。

  • 清空數(shù)組使用 .length = 0凭疮。

函數(shù)
  • 一個函數(shù)的長度控制在 50 行以內(nèi)。
    解釋:
    將過多的邏輯單元混在一個大函數(shù)中串述,易導致難以維護执解。一個清晰易懂的函數(shù)應該完成單一的邏輯單元。復雜的操作應進一步抽取,通過函數(shù)的調(diào)用來體現(xiàn)流程衰腌。

  • 特定算法等不可分割的邏輯允許例外新蟆。

  • 一個函數(shù)的參數(shù)控制在 6 個以內(nèi)。
    解釋:
    除去不定長參數(shù)以外右蕊,函數(shù)具備不同邏輯意義的參數(shù)建議控制在 6 個以內(nèi)琼稻,過多參數(shù)會導致維護難度增大。

  • 某些情況下帕翻,如使用 AMD Loader 的 require 加載多個模塊時嘀掸,其 callback 可能會存在較多參數(shù)睬塌,因此對函數(shù)參數(shù)的個數(shù)不做強制限制歇万。

  • 空函數(shù)不使用 new Function() 的形式贪磺。

示例:

    var emptyFunction = function () {};
  • 對于性能有高要求的場合,建議存在一個空函數(shù)的常量瞄崇,供多處使用共享。

示例:

    var EMPTY_FUNCTION = function () {};

    function MyClass() {
    }

    MyClass.prototype.abstractMethod = EMPTY_FUNCTION;
    MyClass.prototype.hooks.before = EMPTY_FUNCTION;
    MyClass.prototype.hooks.after = EMPTY_FUNCTION;

元素樣式style

  • 盡可能通過為元素添加預定義的 className 來改變元素樣式腮郊,避免直接操作 style 設置

  • 通過 style 對象設置元素樣式時轧飞,對于帶單位非 0 值的屬性撒踪,不允許省略單位

之前寫的筆記制妄,想要再找原文耕捞,找不到了烫幕。较曼。只是知識的搬運工捷犹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伏恐,一起剝皮案震驚了整個濱河市翠桦,隨后出現(xiàn)的幾起案子胳蛮,更是在濱河造成了極大的恐慌仅炊,老刑警劉巖蜕窿,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桐经,死亡現(xiàn)場離奇詭異阴挣,居然都是意外死亡畔咧,警方通過查閱死者的電腦和手機揖膜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門拜隧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人犀呼,你說我怎么就攤上這事外臂∷喂猓” “怎么了罪佳?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵赘艳,是天一觀的道長蕾管。 經(jīng)常有香客問我掰曾,道長旷坦,這世上最難降的妖魔是什么秒梅? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任岗屏,我火速辦了婚禮这刷,結(jié)果婚禮上暇屋,老公的妹妹穿的比我還像新娘。我一直安慰自己扬霜,他們只是感情好著瓶,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著季眷,像睡著了一般余蟹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上子刮,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天威酒,我揣著相機與錄音,去河邊找鬼挺峡。 笑死兼搏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沙郭。 我是一名探鬼主播佛呻,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼病线!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤司澎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丛肢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡篮愉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年助析,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西轩。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡措近,死狀恐怖诗力,靈堂內(nèi)的尸體忽然破棺而出菜拓,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布瞎颗,位于F島的核電站倦逐,受9級特大地震影響穿铆,放射性物質(zhì)發(fā)生泄漏凤优。R本人自食惡果不足惜幸逆,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一栖袋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦电媳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剩愧。三九已至锦积,卻和暖如春垛叨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辞做。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工琳要, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秤茅。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓稚补,卻偏偏與公主長得像,于是被迫代替她去往敵國和親框喳。 傳聞我的和親對象是個殘疾皇子课幕,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock閱讀 3,371評論 2 36
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,233評論 0 4
  • JavaScript編碼規(guī)范 1 前言 [2 代碼風格] [2.1 文件] [2.2 結(jié)構(gòu)] [2.2.1 縮進]...
    憶飛閱讀 1,157評論 1 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)五垮,斷路器乍惊,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 人間歲月不饒人, 低唱情歌兩三首放仗。 往事回首物依舊润绎, 時光昔人卻白頭。
    書南Q閱讀 302評論 1 9