成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解JS ES6編碼規范

瀏覽:169日期:2024-03-27 14:33:54
1、塊級作用域1.1、let取代var

ES6 提出了兩個新的聲明變量的命令: let 和const。其中,let可以完全取代var,因為兩者語義相同,而且let沒有副作用。

var命令存在變量提升的特性,而let沒有這個命令。

所謂變量提升,即指變量可以先使用,再聲明,顯然,這種編碼規范非常不適合閱讀。

1.2、全局常量和線程安全

在let和const之間,優先使用const。

let應出現在單線程模塊代碼內,而const則非常適合多線程。

// bad var a = 1, b = 2, c = 3; // good const a = 1; const b = 2; const c = 3; // best const[a, b, c] = [1, 2, 3];2、字符串

靜態字符串一律使用單引號或者反引號,不推薦使用雙引號。

動態字符串(字符串模板)使用反引號。

// badconst a = 'zhaoyi';const b = a + ', hello.';// little goodconst c = `zhaoyi`;// very goodconst a = ’zhaoyi’;const b = `zhaoyi,${a}, I say your name twice`;3、解構賦值

1、使用數組成員對變量進行賦值時,優先使用解構賦值。

const arr = [’I’, ’love’, ’you’];// badconst one = arr[0];const two = arr[1];const three = arr[2];// goodconst [first, second, third] = arr;// testconsole.log(first, second, third);// I love you

2、函數的參數如果是對象的成員,優先使用解構賦值。

// badfunction getUserInfo(user){ const name = user.name; const age = user.age;}// goodfunction getUserInfo2(user){ const {name, age} = user; console.log(name, age); // }// testgetUserInfo2({name: ’zhaoyi’, age: 20}); // zhaoyi 20

3、如果函數返回多個值,優先使用對象的結構賦值,而不是數組的結構賦值。這樣便于以后添加返回值,以及更改返回值的順序。

// badfunction getInfo(input){ return [left, right];}// goodfunction getInfo2(input){ return {left, right};}// 此處使用對象的解構賦值方式接收返回結果const {left, right} = getInfo2(’test’);4、對象

1、單行定義的對象,最后一個成員不以逗號結尾。多行定義的對象,最后一個成員以逗號結尾。

// badconst a1 = {k1: v1, k2: v2, k3: v3,};// good const a2 = {k1: v1, k2: v2, k3: v3};// badconst b1 = { k1: v1, k2: v2};// goodconst b2 = { k1: v1, k2: v2,};

2、對象盡量靜態化,一旦定義,就不得隨意添加新的屬性。如果添加屬性不可避免,要使用assign方法。

// badconst a = {};a.attr = 3;// if reshape anavoidable(若無可避免)const b = {};Object.assign(b, {atrr: 3});// goodconst c = {attr: null};c.attr = 3;// testconsole.log(a); //{attr: 3}console.log(b); //{attr: 3}console.log(c); //{attr: 3}

3、如果對象的屬性名是動態的(所謂動態是指,需要通過計算得到),可以在創建對象的時候使用屬性表達式定義。(此種情況在開發時,并不多見。)

5、數組

使用擴展運算符(...)復制數組。

// badfunction copyArr1(arr){ const itemCopy = []; for (let index = 0; index < arr.length; index++) {itemCopy[index] = arr[index]; } return itemCopy;}// goodfunction copyArr2(arr){ return [...arr];}// testconst arr = [’z’, ’y’, ’z’];console.log(copyArr1(arr)); // ['z', 'y', 'z']console.log(copyArr2(arr)); // ['z', 'y', 'z']

使用Array.from 方法將類似數組的對象轉為數組。

const obj = { '0': 'a', '1': 'b', length: 2};const arr = Array.from(obj);// testconsole.log(arr); // ['a', 'b']6、函數

1、立即執行函數可以寫成箭頭函數的形式。

(() => { console.log(’this is a good night.’);})();

2、在需要使用函數表達式的場合,盡量用箭頭函數代替。因為這樣可以更簡潔,而且綁定了this。

// badconst sayHello = [’a’, ’b’, ’c’].map(function (w){ return ’Hello, ’ + w;})// good const sayHello2 = [’a’, ’b’, ’c’].map(w => { return ’Hello, ’ + w;});// testconsole.log(sayHello2); // ['Hello, a', 'Hello, b', 'Hello, c']

3、箭頭函數取代Function.prototype.bind,不應再用self/_this/that綁定this.

// badconst self = this;const boundMethod = function(...params){ return method.apply(self, params);}// acceptableconst boundMethod2 = method.bind(this);// bestconst boundMehod3 = (...params) => method.apply(this, params);

4、單行簡單、無需復用的函數,建議采用箭頭函數。如果函數體較為復雜,行數較多,還是應采用傳統的函數寫法。

5、所有配置項都應該集中在一個對象,放在到最后一個參數,布爾值不可以直接作為參數。

// badfunction divide(a, b, option = false){}// goodfunction divide(a, b, {option = false} = {}){}

6、不要在函數體內使用arguments變量,使用rest運算符(...)代替。因為rest運算符可以顯示聲明我們想要獲取的參數,而且arguments是一個類似數組的對象,而rest元素安撫可以提供一個真正的數組。

// badfunction f1(){ const args = Array.prototype.slice.call(arguments); return args.join(’-’);}// goodfunction f2(...args){ return args.join(’-’);}// testconsole.log(f1(1, 2, 3)); // 1-2-3console.log(f2(1, 2, 3)); // 1-2-3

擴展運算符用三個點號表示,功能是把數組或類數組對象展開成一系列用逗號隔開的值;而rest運算符也是三個點號,不過其功能與擴展運算符恰好相反,把逗號隔開的值序列組合成一個數組。rest是剩余的意思。

7、使用默認值語法設置函數參數的默認值。

// badfunction handleThings(opts){ opts = opts || {}; // ...}// goodfunction handleThings2(opts = {}){ // ...}7、Map結構

Map和Object給人的感覺是同一個數據類型,但是在實際語義還需要更為準確的區分,原則如下:

模擬實體對象時,使用Object; 只需要k-v鍵值對數據結構時,使用Map;

Map擁有內建的遍歷機制(實現了Iterator結構)

// Map擁有許多初始化方式,這里使用數組成員為兩個長度的數組進行初始化(第一個元素為K,第二個元素為V)let map = new Map([[’k1’, ’I’], [’k2’, ’love’], [’k3’, ’your’]]);// 遍歷Kfor(const key of map.keys()){ console.log(key); // k1 // k2 // k3}// 遍歷Vfor (const value of map.values()) { console.log(value); // I // love // you}// 遍歷K-Vfor (const item of map.entries()) { console.log(item); // [’k1’, ’I’] // [’k2’, ’love’] // [’k3’, ’your’]}8、Class

1、總是用Class取代需要prototype的操作。因為Class的寫法更簡潔,更易于理解。接觸過Java、C#比較多的朋友想必更喜歡這樣的類語法方式。

// badfunction Queue1(contents = []){ this._queue = [...contents];}Queue1.prototype.pop = function(){ const value = this._queue[0]; this._queue.splice(0, 1); return value;}// goodclass Queue { constructor(contents = []){// 這里為什么不用this._queue = contents;呢?// 讀過effective java的朋友想必知道一個規則:// 那就是在設計構造函數時,若傳入的參數中有可變類型(對象、數組),// 則構造函數內部接收此參數時應使用這個對象的拷貝。// 這樣可以避免外部參數對象的更改影響到類本身的實例。// 因此,此處的contents需要拷貝一個復制在進行賦值。this._queue = [...contents]; } pop() {const value = this._queue[0];this._queue.splice(0, 1);return value; }}// testq = new Queue([1, 2, 3]);console.log(q.pop()); // 1console.log(q.pop()); // 2console.log(q.pop()); // 3console.log(q.pop()); // undefined

2、使用extends實現繼承,因為這樣可以更簡單,不存在破壞instanceof運算的危險。

// Queue為上一個例子的類class PeekQueue extends Queue{ // ...}9、模塊

1、Module語法是js模塊的標準寫法,要堅持使用這種寫法。使用import取代require。

// badconst ma = require(’moduleA’);const f1 = ma.f1;const f2 = ma.f2;// goodimport {f1, f2} from ’moduleA’;

2、使用export取代module.export

// badmodule.exports = SomeObj;// goodexport default SomeObj;

3、如果模塊只有一個輸出值,就使用 export default; 若有鍍鉻,就不要使用 export default, 不要同時使用 export default 和 普通的 export,雖然規則上允許此種編寫代碼的方式。

4、不要在模塊中使用通配符,因為這樣可以確保模塊中有一個默認輸出:export default。

// badimport * as myObject ’./someModule’;// goodimport myObject from ’./someModule’;

5、如果模塊默認輸出一個函數,函數的首字母應該小寫。

function someFunction(){ // ... } export default someFunction;

6、 如果模塊默認輸出一個對象,對象名的首字母應該大寫。

const someObj = { // ...}export default SomeObj;10、ESLint

前面說了那么多規則,其實只是規則范本的冰山一角,真正想要寫出格式優美、符合主流廠商規范的代碼,僅僅靠我們的自覺是不夠的。

有沒有什么類似軟件編譯工具檢查代碼正確性來檢查代碼編寫規范的軟件呢,答案是有的。

ESLint就是這樣的一款檢查工具。可以用于保證寫出語法正確、風格統一的代碼。

以下是安裝ESLink的教程(確保您的環境已經安裝了npm),當然,如果您使用一些腳手架工具(例如@vue-cli)等方式生成的項目,那么這樣的項目都是提供了可選的eslint插件的。當前版本為: v6.6.0。該版本的eslint提供了更為簡單的配置方式,可以參考https://eslint.bootcss.com/docs/user-guide/getting-started/進行配置。以下是一個粗略的配置步驟

1、安裝所需插件

$ npm install eslint -g

2、生成package.json文件

$ npm init

該方法會在當前目錄生成package.json文件,該文件類似于環境的說明文件。

3、生成eslint配置文件

$ eslint --init

該命令會詢問你使用哪種類型的配置(通過上下箭頭選取)

推薦選用json或者JavaScript類型,我這里使用的是JavaScript類型的配置文件 style guide選用airbnb。

其他的選項根據你的需要進行選取即可。完成選擇之后,會自動下載所需要的依賴包。

生成的配置文件內容大致如下:

module.exports = { env: { browser: true, es6: true, }, extends: [ ’airbnb-base’, ], globals: { Atomics: ’readonly’, SharedArrayBuffer: ’readonly’, }, parserOptions: { ecmaVersion: 2018, sourceType: ’module’, }, rules: { },};

我們在該配置文件中可以修改驗證規則,具體的內容同樣參考上面給出的鏈接。

4、在當前目錄下,創建一個js文件

// index.jsvar unused = ’灰與幻想的格林姆迦爾’;function hello(){ var message = 'Hello, zhaoyi!'; alert(message);} hello();

5、通過eslint驗證代碼編寫正確性

$ eslint index.js

 1:12  error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  2:1   error    Unexpected var, use let or const instead         no-var

  2:5   error    ’unused’ is assigned a value but never used      no-unused-vars

  2:27  error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  3:1   error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  4:17  error    Missing space before opening brace               space-before-blocks

  4:18  error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  5:1   error    Expected indentation of 2 spaces but found 4     indent

  5:5   error    Unexpected var, use let or const instead         no-var

  5:19  error    Strings must use singlequote                     quotes

  5:36  error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  6:1   error    Expected indentation of 2 spaces but found 4     indent

  6:5   warning  Unexpected alert                                 no-alert

  6:20  error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  7:2   error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  8:1   error    Trailing spaces not allowed                      no-trailing-spaces

  8:3   error    Expected linebreaks to be ’LF’ but found ’CRLF’  linebreak-style

  9:9   error    Trailing spaces not allowed                      no-trailing-spaces

  9:10  error    Newline required at end of file but not found    eol-last

其中,有一種錯誤其實是因為git文件格式轉化的問題:

... linebreak-style

我們可以在配置文件中移除該檢測:在rules下添加’linebreak-style’: [0, ’error’, ’windows’].

rules: { ’linebreak-style’: [0, ’error’, ’windows’] }

繼續運行檢測命令,可以看到如下的輸出:

2:1   error    Unexpected var, use let or const instead      no-var

2:5   error    ’unused’ is assigned a value but never used   no-unused-vars

5:1   error    Expected indentation of 2 spaces but found 4  indent

5:5   error    Unexpected var, use let or const instead      no-var

5:19  error    Strings must use singlequote                  quotes

6:1   error    Expected indentation of 2 spaces but found 4  indent

6:5   warning  Unexpected alert                              no-alert

8:1   error    Trailing spaces not allowed                   no-trailing-spaces

9:9   error    Trailing spaces not allowed                   no-trailing-spaces

可以看到,我們許多不規范的操作都會警告了。比如縮進不要用四空格(其實是我們的編譯器自帶,而且我們習慣了的),不要加多余的空格,以及刪掉沒有使用過的聲明變量,不推薦使用var類型等等。

如果覺得合情合理,那么遵循之;如果覺得縮進這些不符合自己的習慣,也可以通過配置文件進行關閉/修改等操作達到預期的效果。

以上就是詳解JS ES6編碼規范的詳細內容,更多關于JS ES6編碼規范的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品一级久久久| 精品理论电影在线观看| 欧美成人高清电影在线| 日本不卡高清视频| 国产精品一区毛片| 亚洲色图另类专区| 99re66热这里只有精品3直播 | 国内外成人在线视频| 色综合 综合色| 亚洲福利视频三区| 亚洲经典三级| 国产三级精品三级| 99久久伊人网影院| 欧美不卡一区二区三区四区| 国产精品一区二区三区乱码| 在线观看国产日韩| 日韩精品视频网| 久久综合九色综合网站| 亚洲一区二区三区激情| 国产美女一区| 天天操天天综合网| 色诱视频网站一区| 日韩黄色免费网站| 在线观看亚洲一区| 久久精品国产亚洲高清剧情介绍| 久久综合婷婷| 石原莉奈在线亚洲二区| 老牛国产精品一区的观看方式| 三级精品在线观看| 欧美在线观看视频在线| 狠狠网亚洲精品| 日韩一区二区视频| hitomi一区二区三区精品| 99久久99久久综合| 亚洲国产高清在线观看视频| 欧美极品一区| **欧美大码日韩| 亚洲少妇自拍| 亚洲线精品一区二区三区八戒| 久久综合导航| 精品一二三四在线| 欧美精品一级二级三级| 成人福利视频在线| 中文一区二区完整视频在线观看| 中文字幕一区二区三区四区不卡| 日韩午夜精品| 青青草一区二区三区| 在线观看91av| 91在线视频免费91| 国产精品女同一区二区三区| 在线精品亚洲| 午夜一区二区三区视频| 日韩成人一级大片| 欧美成人伊人久久综合网| 国产精品www994| 亚洲一级不卡视频| 色综合久久久久综合体桃花网| 日本色综合中文字幕| 欧美嫩在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 国产日产欧美一区二区视频| 精品电影一区| 天使萌一区二区三区免费观看| 欧美另类高清zo欧美| 91碰在线视频| 亚洲国产欧美在线| 欧美精品欧美精品系列| 91捆绑美女网站| 亚洲午夜精品网| 3atv在线一区二区三区| 欧美尤物一区| 洋洋av久久久久久久一区| 在线观看欧美日本| 北岛玲一区二区三区四区| 中文字幕中文乱码欧美一区二区| 麻豆久久精品| 丰满少妇在线播放bd日韩电影| 国产精品污污网站在线观看| 老牛国产精品一区的观看方式| 国产精品69毛片高清亚洲| 国产精品色一区二区三区| 久久免费99精品久久久久久| 国产成人亚洲综合色影视| 国产精品国产三级国产普通话蜜臀 | 一本色道久久综合亚洲精品不 | 国产精品www994| 日韩av午夜在线观看| 久久综合久久综合九色| 一本综合久久| 久久精品国产亚洲高清剧情介绍| 久久精品视频在线免费观看| 噜噜噜噜噜久久久久久91| 国产99精品在线观看| 亚洲美女偷拍久久| 日韩视频在线一区二区| 国产视频久久| 国产成人综合自拍| 一区二区三区欧美久久| 欧美一二三在线| 国产一区二区三区免费不卡| 国产精品白丝jk白祙喷水网站 | 91国产福利在线| 欧美极品一区二区三区| 久久99精品视频| 自拍偷自拍亚洲精品播放| 欧美三级韩国三级日本一级| 伊人久久久大香线蕉综合直播| 韩国一区二区视频| 亚洲丝袜精品丝袜在线| 欧美一区午夜精品| 亚洲欧美网站| 99re亚洲国产精品| 另类小说综合欧美亚洲| 中文字幕欧美一区| 欧美一区二区视频观看视频| 国产欧美不卡| 成人动漫av在线| 日韩1区2区日韩1区2区| 国产精品网站在线| 91麻豆精品国产91久久久久| 国产伦精品一区二区| 成人av集中营| 人妖欧美一区二区| 国产精品免费丝袜| 日韩欧美久久一区| 色播五月激情综合网| 精品91免费| 成人av资源在线| 麻豆成人91精品二区三区| 亚洲免费伊人电影| 久久久久久久精| 色婷婷久久综合| 99国产精品久久久久老师| 成人av网址在线观看| 美女视频网站久久| 一区二区三区在线视频免费| 久久久久久一级片| 538prom精品视频线放| 久久久xxx| 亚洲激情网站| 91丨九色porny丨蝌蚪| 国产尤物一区二区| 日韩精品欧美成人高清一区二区| 中文字幕一区日韩精品欧美| 精品国产凹凸成av人网站| 欧美视频一区二| 一本久道久久久| 国内精品久久国产| 99视频精品在线| 国产乱妇无码大片在线观看| 日韩和欧美的一区| 亚洲va韩国va欧美va精品| 亚洲欧美一区二区三区国产精品| 国产无人区一区二区三区| 久久综合丝袜日本网| 日韩欧美国产综合一区 | 欧美三级视频在线观看| 性伦欧美刺激片在线观看| 欧美日韩高清在线一区| 成人av中文字幕| 国产河南妇女毛片精品久久久| 美腿丝袜亚洲综合| 日本少妇一区二区| 天使萌一区二区三区免费观看| 亚洲一区二区三区美女| 伊人性伊人情综合网| **性色生活片久久毛片| 综合久久给合久久狠狠狠97色| 欧美国产成人在线| 久久久国产一区二区三区四区小说 | 91一区在线观看| 国产99精品国产| 国内精品国产三级国产a久久| 日本欧美大码aⅴ在线播放| 亚洲第一主播视频| 亚洲成人av在线电影| 性久久久久久久久| 亚洲h在线观看| 亚洲高清在线精品| 亚洲成人福利片| 视频一区二区欧美| 老司机免费视频一区二区三区| 久久99精品久久久| 激情五月播播久久久精品| 久久99国产精品久久99果冻传媒| 蜜臀av一区二区在线免费观看| 麻豆久久久久久久| 九九在线精品视频| 精东粉嫩av免费一区二区三区| 精品亚洲成a人| 国产精品一区二区三区乱码| 粉嫩av一区二区三区| 成人自拍视频在线| gogo大胆日本视频一区| 99久久伊人精品| 午夜国产精品视频免费体验区| 合欧美一区二区三区| 亚洲黄色在线| 性伦欧美刺激片在线观看| 久久免费一区|