整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JavaScript-編程風格

          JavaScript-編程風格

          篇文章我們將討論如何將新的語法應(yīng)用在編碼實踐當中,與傳統(tǒng)的 JavaScript 語法結(jié)合在一起,寫出合理的、易于閱讀和維護的代碼。

          所謂"編程風格",指的是編寫代碼的規(guī)則。不同的程序員,往往有不同的編程風格。而且這里的風格包括語法上的編程風格格式上的編程風格。

          一.塊級作用域let 取代 var - 語法上的編程風格

          1.ES6 提出了兩個新的聲明變量的命令:let和const。

          其中,let完全可以取代var,因為兩者語義相同,而且let沒有副作用。

          if (true) {
              let x='hello';
          }
          
          for (let y=0; y <=10; y++) {
              console.log(y);
          }
          
          
          if (true) {
              var x='hello';//全局變量x
          }
          
          for (var y=0; y <=10; y++) {//全局變量y
              console.log(y);
          }
          

          上面代碼如果用var替代let,實際上就聲明了兩個全局變量,這顯然不是理想的設(shè)計方式。變量應(yīng)該只在其聲明的代碼塊內(nèi)有效,var命令做不到這一點。


          2.var命令存在變量提升效用,let命令沒有這個問題。

          if (true) {
              console.log(x); // ReferenceError引用錯誤
              let x='hello';
          }
          
          if (true) {
              console.log(x); // undefined,變量提升
              var x='hello';
          }
          


          3.在let和const之間,建議優(yōu)先使用const,尤其是在全局環(huán)境,不應(yīng)該設(shè)置變量,應(yīng)設(shè)置常量。原因是const可以提醒閱讀程序的人,這個變量不能改變,比較符合函數(shù)式編程思想,并且JavaScript 編譯器會對const進行優(yōu)化,所以多使用const,有利于提高程序的運行效率。

          //傳統(tǒng)的方式
          var a=1,
          b=2,
          c=3;
          
          //新的方式
          const a=1;
          const b=2;
          const c=3;
          
          //更優(yōu)的方式
          const [a, b, c]=[1, 2, 3];
          


          二、字符串 靜態(tài)字符串一律使用單引號或反引號,不使用雙引號。動態(tài)字符串使用反引號。

          //不建議
          const a="foobar";
          const b='foo' + a + 'bar';
          
          //建議
          const a='foobar';
          const b=`foo${a}bar`;
          


          三.解構(gòu)賦值

          ES6允許按照一定模式,從數(shù)組和對象中提取值,對變量進行賦值,這被稱為解構(gòu)

          使用數(shù)組成員對變量賦值時,優(yōu)先使用解構(gòu)賦值。
          const arr=[1, 2, 3, 4];
          // 不建議
          const first=arr[0];
          const second=arr[1];
          
          // 建議
          const [first, second]=arr;
          
          
          函數(shù)的參數(shù)如果是對象的成員,優(yōu)先使用解構(gòu)賦值。
          // 不建議
          function getFullName(user) {
            const firstName=user.firstName;
            const lastName=user.lastName;
          }
          // 建議
          function getFullName(obj) {
            const { firstName, lastName }=obj;
          }
          // 建議
          function getFullName({ firstName, lastName }) {
          }
          


          四.其他操作

          1.對象的操作

          對象盡量靜態(tài)化,一旦定義,就不得隨意添加新的屬性。如果添加屬性不可避免,要使用Object.assign方法。

          // 不建議
          const a={};
          a.x=3;
          
          // 建議
          const a={};
          Object.assign(a, { x: 3 });
          // 或者這樣
          const a={ x: null };
          a.x=3;
          

          對象的屬性和方法,盡量采用簡潔表達法

          var ref='some value';
          // 不推薦
          const atom={
            ref: ref,
            value: 1,
            addValue: function (value) {
              return atom.value + value;
            },
          };
          
          // 推薦
          const atom={
            ref,
            value: 1,
            addValue(value) {
              return atom.value + value;
            },
          };
          

          2.使用擴展運算符(...)拷貝數(shù)組

          let arr1=[1, 2, 3];
          let arr2=[4, 5, 6];
          let arr3=[7, 8, 9];
          console.log(arr1.concat(arr2, arr3)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
          console.log([...arr1, ...arr2, ...arr3]); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
          

          3.立即執(zhí)行函數(shù)可以寫成箭頭函數(shù)的形式。

          (()=> {
            console.log('Welcome to the Internet');
          })();
          

          4.用 Class取代prototype 的操作。因為 Class 的寫法更簡潔,更易于理解。

          // 構(gòu)造函數(shù)+原型
          function Person(name, age, sex) {
              this.name=name;
              this.age=age;
              this.sex=sex;
              this.showinfo=function() { 
                  return this.name;
              }
          }
          
          Person.prototype.showinfo=function() { 
              return this.name + this.age + this.sex
          }
          
          // class
          class Person {
              constructor(name, age, sex) {
                  this.name=name; 
                  this.age=age;
                  this.sex=sex;
              }
              showinfo() { 
                  return this.name
              }
          }
          

          5.ESLint 的使用

          ESLint 是一個語法規(guī)則和代碼風格的檢查工具,可以用來保證寫出語法正確、風格統(tǒng)一的代碼。

          首先,在項目的根目錄安裝 ESLint。

          $ npm install --save-dev eslint
          

          然后,安裝 Airbnb 語法規(guī)則,以及 import、a11y、react 插件。

          $ npm install --save-dev eslint-config-airbnb
          $ npm install --save-dev eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
          

          最后,在項目的根目錄下新建一個.eslintrc文件,配置 ESLint。

          {
            "extends": "eslint-config-airbnb"
          }
          

          現(xiàn)在就可以檢查,當前項目的代碼是否符合預(yù)設(shè)的規(guī)則。

          index.js文件的代碼如下。

          var unused='I have no purpose!';
          
          function greet() {
              var message='Hello, World!';
              console.log(message);
          }
          

          greet(); 使用 ESLint 檢查這個文件,就會報出錯誤。

          $ npx eslint index.js
          index.js
            1:1  error  Unexpected var, use let or const instead          no-var
            1:5  error  unused is defined but never used                 no-unused-vars
            4:5  error  Expected indentation of 2 characters but found 4  indent
            4:5  error  Unexpected var, use let or const instead          no-var
            5:5  error  Expected indentation of 2 characters but found 4  indent
          
          ? 5 problems (5 errors, 0 warnings)
          

          上面代碼說明,原文件有五個錯誤,其中兩個是不應(yīng)該使用var命令,而要使用let或const;一個是定義了變量,

          卻沒有使用;另外兩個是行首縮進為 4 個空格,而不是規(guī)定的 2 個空格。


          五.括號的位置 - 語法格式上的編程風格

          1.大括號的位置

          絕大多數(shù)的編程語言,都用大括號({})表示代碼塊。對于起首的大括號的位置,有許多不同的寫法。

          最流行的有兩種。

          第一種是起首的大括號另起一行 - 推薦

          block{
          
          }

          第二種是起首的大括號跟在關(guān)鍵字的后面,但是Javascript會自動添加句末的分號,有可能會導(dǎo)致一些難以察覺的錯誤。

          //下面的情況就會產(chǎn)生問題。
          function fn() {
              return 
              {  
                  key: value
              };
          }

          2.圓括號

          圓括號在Javascript中有兩種作用,一種表示調(diào)用函數(shù),另一種表示不同的值的組合。我們可以用空格,區(qū)分這兩

          種不同的括號。

          調(diào)用函數(shù)的時候,函數(shù)名與左括號之間沒有空格。

          function fn(){}
          fn()

          函數(shù)名與參數(shù)序列之間,沒有空格。

          function fn(x,y){
              return x + y;
          }
          fn(1,2)

          所有其他語法元素與左括號之間,都有一個空格

          if (a===0){...}


          3.分號

          分號表示語句的結(jié)束。大多數(shù)情況下,如果你省略了句尾的分號,Javascript會自動添加。

          但麻煩的是,如果下一行的第一個符號是下面這五個字符之一,Javascript將不對上一行句尾添加分號:"("、"["、"/"、"+"和"-"。


          4.相等和嚴格相等(恒等)

          Javascript有兩個表示"相等"的運算符:"相等"(==)和"嚴格相等"(===)。

          因為"相等"運算符會自動轉(zhuǎn)換變量類型(隱式轉(zhuǎn)換),這樣寫會造成很多意想不到的情況。


          所有變量聲明都放在函數(shù)的頭部。

          所有函數(shù)都在使用之前定義。

          于那些還不熟悉JavaScript的編寫風格的人,谷歌提供了編寫JavaScript的編寫風格指南,谷歌風格指南 其中列出了編寫干凈、可理解代碼的最佳風格實踐。



          對于編寫有效的JavaScript來說,這些并不是硬性的、快速的規(guī)則,而只是在源文件中維護一致的、吸引人的樣式選擇的規(guī)則。這對于JavaScript來說尤其有趣,它是一種靈活且多變的語言,允許多種風格的選擇。

          谷歌和Airbnb有兩個最受歡迎的編寫風格指南。如果我的工作是花費大量時間編寫JS,那么可以先學習這兩種方法。

          以下是谷歌JS風格指南中我認為最有趣和相關(guān)的13條規(guī)則:

          谷歌JS風格指南處理各種各樣的問題,從激烈爭論的問題(制表符與空格的比較,以及分號應(yīng)該如何使用這個有爭議的問題),到一些更模糊的規(guī)范,這些規(guī)范令我吃驚,它們肯定會改變我以后寫JS的方式。

          對于每個規(guī)則,我將對規(guī)范進行總結(jié),然后引用樣式指南中的支持部分,詳細描述該規(guī)則。在適用的情況下,我還將提供實踐中的樣式示例,并將其與不遵循規(guī)則的代碼進行對比。

          使用空格,而不是制表符

          除了行結(jié)束符序列之外,ASCII水平空格字符(0x20)是源文件中出現(xiàn)在任何位置的惟一空格字符。這意味著…制表符不用于縮進

          使用兩個空格(而不是四個)進行縮進

          // bad
          function foo() {
          ????let name;
          }
           
          // bad
          function bar() {
          ?let name;
          }
           
          // good
          function baz() {
          ??let name;
          }
          

          分號是必需的

          每個語句必須以分號結(jié)束,禁止依靠自動分號插入。

          雖然無法想象為什么會有人反對這個想法,但JS中分號的一致使用正在成為新的“空格對制表符”的爭論。谷歌一慣建議結(jié)束需要使用分號。

          // bad
          let luke={}
          let leia={}
          [luke, leia].forEach(jedi=> jedi.father='vader')
           
          // good
          let luke={};
          let leia={};
          [luke, leia].forEach((jedi)=> {
           jedi.father='vader';
          });
          

          為了幫助大家讓學習變得輕松、高效,給大家免費分享一大批資料,幫助大家在成為全棧工程師,乃至架構(gòu)師的路上披荊斬棘。在這里給大家推薦一個前端全棧學習交流圈:866109386(點擊即可進群).歡迎大家進群交流討論,學習交流,共同進步。

          不要使用ES6模塊

          不要使用ES6模塊(即導(dǎo)出和導(dǎo)入關(guān)鍵字),因為它們的語義還沒有最終確定。注意,一旦語義完全標準,將重新定義使用的方式。

          // 先別做這種事
          //------ lib.js ------
          export function square(x) {
           return x * x;
          }
          export function diag(x, y) {
           return sqrt(square(x) + square(y));
          }
           
          //------ main.js ------
          import { square, diag } from 'lib';
          

          不鼓勵(但不禁止)水平對齊

          這種做法是允許的,但谷歌編寫風格通常不鼓勵這樣做,甚至不需要在已經(jīng)使用它的地方保持水平對齊。

          水平對齊是在代碼中添加可變數(shù)量的額外空格,以使某行變量的值與前面變量值對齊。

          // bad
          {
           tiny: 42, 
           longer: 435, 
          };
           
          // good
          {
           tiny: 42, 
           longer: 435,
          };
          

          不要再使用var了

          使用const或let聲明所有本地變量來代替 var。默認情況下使用 const,除非需要重新分配變量在使用 let 聲明。

          // bad
          var example=42;
           
          // good
          let example=42;
          

           箭頭函數(shù)是首選

          箭頭函數(shù)提供了簡潔的語法,并解決了this 在函數(shù)中不確定性的一些問題,與function關(guān)鍵字相比,更喜歡箭頭函數(shù),特別是對于嵌套函數(shù)。

          老實說,我只是覺得箭頭函數(shù)很棒因為它們更簡潔,更美觀。事實證明,它們還有一個非常重要的用途。

          // bad
          [1, 2, 3].map(function (x) {
           const y=x + 1;
           return x * y;
          });
           
          // good
          [1, 2, 3].map((x)=> {
           const y=x + 1;
           return x * y;
          });
          

          使用模板字符串而不是拼接客串

          在復(fù)雜的字符串連接上使用模板字符串(用`分隔),特別是在涉及多個字符串文本時,模板字符串可以跨越多行。

          // bad
          function sayHi(name) {
           return 'How are you, ' + name + '?';
          }
           
          // bad
          function sayHi(name) {
           return ['How are you, ', name, '?'].join();
          }
           
          // bad
          function sayHi(name) {
           return `How are you, ${ name }?`;
          }
           
          // good
          function sayHi(name) {
           return `How are you, ${name}?`;
          }
          

          不要對長字符串使用 \ 來表示連續(xù)

          不要在普通或模板字符串文字中使用連續(xù)行(也就是說,在字符串文字中以反斜杠結(jié)束一行)。盡管ES5允許這樣做,但是如果斜杠后面有任何尾隨空格,那么可能會導(dǎo)致一些棘手的錯誤,而且對讀者來說不太明顯。

          有趣的是,谷歌和Airbnb不同意這個規(guī)則(這是Airbnb的規(guī)范)。

          雖然谷歌建議連接更長的字符串(如下所示),Airbnb的風格指南基本上建議什么也不做,并允許長字符串繼續(xù),只要他們需要。

          // bad (sorry, this doesn't show up well on mobile)
          const longString='This is a very long string that \
           far exceeds the 80 column limit. It unfortunately \
           contains long stretches of spaces due to how the \
           continued lines are indented.';
           
          // good
          const longString='This is a very long string that ' + 
           'far exceeds the 80 column limit. It does not contain ' + 
           'long stretches of spaces since the concatenated ' +
           'strings are cleaner.';
          

          for…of是for循環(huán)的首選類型

          使用ES6,該語言現(xiàn)在有三種不同的for循環(huán)。所有的循環(huán)都可以使用,但是如果可能的話,for-of循環(huán)應(yīng)該是首選的。

          如果您問我,這是一個奇怪的問題,但是我認為我應(yīng)該包含它,因為谷歌聲明了一種首選的for循環(huán)類型,這非常有趣。

          我總覺得 for...in 循環(huán)對于對象更好,而對于for...of 的更適合數(shù)組,不同場景可以使用不同方式。

          雖然這里的Google規(guī)范不一定與這個想法相矛盾,但是了解他們特別喜歡這個循環(huán)還是很有趣的。

          不要使用eval()

          不要使用eval或function(…string)構(gòu)造函數(shù)(代碼加載器除外)。這些特性具有潛在的危險,而且在CSP環(huán)境中根本不起作用

          MDN 頁面的eval()中,甚至有一個名為“不要使用eval!”

          // bad
          let obj={ a: 20, b: 30 };
          let propName=getPropName(); // returns "a" or "b"
          eval( 'var result=obj.' + propName );
           
          // good
          let obj={ a: 20, b: 30 };
          let propName=getPropName(); // returns "a" or "b"
          let result=obj[ propName ]; // obj[ "a" ] is the same as obj.a
          

          常量應(yīng)該用全大寫字母命名,用下劃線分隔

          常量名稱使用CONSTANT_CASE的格式:所有大寫字母,單詞由下劃線分隔。

          如果您絕對確信某個變量不應(yīng)該更改,那么可以通過將該常量的名稱大寫來表示。這使得在整個代碼中使用該常量時,它的不變性非常明顯。

          一個值得注意的例外是,如果常量是函數(shù)作用域的。在這種情況下,應(yīng)該用camelCase來寫。

          // bad
          const number=5;
           
          // good
          const NUMBER=5;
          

          每次聲明一個變量

          每個局部變量聲明只聲明一個變量:聲明如令a=1, b=2,不推薦。

          // bad
          let a=1, b=2, c=3;
           
          // good
          let a=1;
          let b=2;
          let c=3;
          

          使用單引號,而不是雙引號

          普通的字符串用單引號(')分隔,而不是雙引號(")。

          提示:如果字符串包含單引號字符,可以考慮使用模板字符串來避免轉(zhuǎn)義引號。

          // bad
          let directive="No identification of self or mission."
          // bad
          let saying='Say it ain\u0027t so.';
           
          // good
          let directive='No identification of self or mission.';
          // good
          let saying=`Say it ain't so`;
          

          最后一個注意

          正如我在開始時所說,這些不是強制要求。谷歌只是眾多科技巨頭之一,這些只是推薦。

          也就是說,看看谷歌這樣的公司提出的風格建議是很有趣的,這家公司雇傭了很多才華橫溢的人,他們花了很多時間編寫優(yōu)秀的代碼。

          如果你想要遵循“符合谷歌的源代碼”的指導(dǎo)原則,那么你可以遵循這些規(guī)則—但是,當然,許多人不同意這些規(guī)則,你可以隨意忽略這些規(guī)則中的任何一個或所有規(guī)則。

          我個人認為在很多情況下Airbnb的規(guī)范比谷歌更有吸引力。無論您對這些特定的規(guī)則采取何種立場,在編寫任何類型的代碼時,始終牢記風格一致性仍然很重要。

          英文原文:13 Noteworthy Points from Google’s JavaScript Style Guide

          最后

          以下是總結(jié)出來最全前端框架視頻,包含: javascript/vue/react/angualrde/express/koa/webpack 等學習資料。

          【領(lǐng)取方式】

          關(guān)注頭條 前端全棧架構(gòu)丶第一時間獲取最新前端資訊學習

          手機用戶可私信關(guān)鍵詞 【前端】即可獲取全棧工程師路線和學習資料!

          web項目開發(fā)過程中,為了是整個項目開發(fā)更加規(guī)范化、減少溝通成本和提高效率,對編碼的規(guī)范還是很重要的一部分。以下就近期的項目經(jīng)驗,針對JavaScript的編碼,做了如下的約定。2018WEB前端JavaScript之編碼風格,分享給大家。

           1、變量與聲明:

          2、常量

          3、函數(shù)

          4、異常處理

          4.1 允許使用 try/catch 語句,不能使用debugger、console、alert等關(guān)鍵字調(diào)試異常

          5、循環(huán)

          6、控制邏輯

          7、字符串

          8、原型

          9、注釋

          備注:對于分號和逗號的使用需要注意:

          1、賦值、定義、返回值、方法調(diào)用后需要強制加分號

          2、對象最后一個屬性不要帶逗號。

          關(guān)于為什么學WEB前端,學了有用嗎,大家已經(jīng)心中有數(shù)了吧!打算深入了解這個行業(yè)的朋友,可以關(guān)注我的頭條號,私信給我 web前端 會自動回復(fù)web前端學習交流群,群里有系統(tǒng)學習教程和學習路線以及詳細的規(guī)劃,我做web前端開發(fā)十年的時間,希望幫助新手少走彎路。


          主站蜘蛛池模板: 国产91精品一区二区麻豆网站| 一区二区三区午夜视频| 无码人妻AⅤ一区二区三区水密桃 无码欧精品亚洲日韩一区夜夜嗨 无码毛片一区二区三区中文字幕 无码毛片一区二区三区视频免费播放 | 国产在线一区二区综合免费视频| 国产在线精品一区二区不卡麻豆| 亚洲综合无码精品一区二区三区| 无码一区二区三区视频| 中文字幕日韩欧美一区二区三区| 国产精品亚洲不卡一区二区三区| 久久久91精品国产一区二区三区| 亚洲国产成人久久综合一区 | 亚洲美女视频一区| 国产成人精品一区二区三在线观看| 99久久国产精品免费一区二区 | 日本一区二区在线播放| 国产婷婷色一区二区三区深爱网| 国产日韩精品视频一区二区三区| 久久精品国产一区二区三区| 久久国产免费一区二区三区| 在线精品视频一区二区| 久久成人国产精品一区二区 | 亚洲大尺度无码无码专线一区 | 国产三级一区二区三区| 日本在线视频一区二区| 国产亚洲一区二区三区在线不卡 | 久久精品免费一区二区三区 | 久久中文字幕无码一区二区| 91视频一区二区| 国产视频一区在线观看| 国产人妖视频一区二区破除| 久久精品一区二区三区AV| 成人区人妻精品一区二区不卡视频 | 在线精品自拍亚洲第一区| 精品国产一区二区三区不卡 | 无码毛片视频一区二区本码| 国产成人高清视频一区二区 | 乱码精品一区二区三区| 久久精品视频一区| 日韩精品一区二区三区中文| 69福利视频一区二区| 亚洲一区中文字幕在线观看|