整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript編碼的一些日常習慣

          JavaScript編碼的一些日常習慣

          論你是 React 開發者還是 Node.js 開發者. 都能寫出可以運行的代碼. 但是你寫的代碼美觀并且別人能看懂嗎?

          下面的規則可以讓你的 JavaScript 代碼更加整潔和清晰.

          規則1. 不要使用隨機的字符作為變量

          不要使用隨機字符去表示一個變量.

          // BAD
          const x = 4;

          應該采用語義化的方式去命名變量.

          // GOOD
          const numberOfChildren = 4;

          規則2. 使用駝峰式命名

          不要使用蛇形命名(snake_case)、帕斯卡命名(PascalCase)或者變量名以動詞開頭.

          // Bad: 以大寫字母開頭 
          var UserName = "Faisal"; 
          
          // Bad: 以動詞開頭 
          var getUserName = "Faisal"; 
          
          // Bad: 使用下劃線 
          var user_name = "faisal";

          使用駝峰命名法代替, 并且使用名詞.

          // Good
          const userName = "Faisal";

          規則3. 使用良好的駝峰來命名函數

          函數名不要用名詞, 避免與變量名混淆.

          // Bad: 以大寫字母開頭 
          function DoSomething() {  
              // code 
          } 
          
          // Bad: 以名詞開頭 
          function car() {  
              // code 
          } 
          
          // Bad: 使用下劃線 
          function do_something() {  
              // code 
          }

          而應該使用駝峰式命名, 并且以動詞開頭.

          //GOOD
          function doSomething() {
              // code
          }

          規則4. 使用帕斯卡來命名構造函數

          // Bad: 以小寫字母開頭 
          function myObject() {  
              // code 
          } 
          
          // Bad: 使用下劃線 
          function My_Object() {  
              // code 
          } 
          
          // Bad: 以動詞開頭 
          function getMyObject() {  
              // code 
          }

          同樣的, 構造函數名不應該以動詞開頭, 并且通過 new 來創建對象實例是一個動作.

          // GOOD
          function MyObject() {  
              // code 
          }
          

          規則5. 全局常量

          全局常量的值不能被改變, 不應該以命名正常變量的方式來命名它.

          // BAD
          const numberOfChildren = 4;
          // BAD 
          const number_of_children = 4;

          所有的單詞應該大寫, 并且以下劃線分隔.

          // GOOD
          const NUMBER_OF_CHILDREN = 4;

          規則6. 分配變量

          不要直接將一個 比較值 分配給變量.

          // BAD 
          const flag = i < count;

          應該使用小括號包裹:

          // GOOD
          const flag = (i < count);

          規則7. 相等運算符的用法

          不要使用 "==" 或 "!=" 來對比值. 因為它們不會檢查兩個值的類型是否相同.

          //BAD
          if (a == b){
              //code
          }

          而應該使用 "===" 或 "!==", 避免類型錯誤.

          //GOOD
          if (a === b){
              //code
          }

          規則8. 三元運算符的用法

          不要使用三元運算符代替 if 條件語句:

          //BAD
          condition ? doSomething() : doSomethingElse();

          僅僅在某些條件下使用它來分配值:

          // GOOD
          const value = condition ? value1 : value2;

          規則9. 簡單的聲明

          不要在一行寫多個聲明語句, 盡管 JavaScript 是支持這么寫的.

          // BAD
          a =b; count ++;

          多個聲明語句應該分成多行. 并且總是應該在語句的末尾添加分號.

          // GOOD
          a = b;
          count++;

          規則10. if 語句的使用

          不要省略 if 語句的大括號, 并且首尾大括號不要寫在同一行.

          // BAD: 不正確的空格 
          if(condition){  
              doSomething(); 
          } 
          ----
          // BAD: 缺失大括號 
          if (condition)  
              doSomething(); 
          ----
          // BAD: 所有的代碼都在一行 
          if (condition) { doSomething(); } 
          ----
          // BAD: 代碼擠在一行, 并且沒有大括號 
          if (condition) doSomething();

          應該總是使用大括號并且進行適當地縮進:

          // GOOD
          if (condition) {
              doSomething();
          }

          規則11. 循環語句的用法

          不要在 for 循環內部聲明變量.

          // BAD: 在循環體內聲明變量 
          for (let i=0, len=10; i < len; i++) {  
              // code
              let i = 0;
          }

          而應該在 for 循環之前聲明.

          // GOOD
          let i = 0;
          
          for (i=0, len=10; i < len; i++) {  
              // code 
          }

          規則12. 縮進長度保持一致

          始終使用 2 個或 4 個縮進.

          // GOOD
          if (condition) {
              doSomething();
          }

          規則13. 單行長度

          任意行的代碼都不要超過 80 個字符. 如果超出的話, 超出的部分應該另起一行.

          // BAD: 下一行只縮進 4 個空格 
          doSomething(argument1, argument2, argument3, argument4,
              argument5); 
          
          // BAD: 在運算符前換行 
          doSomething(argument1, argument2, argument3, argument4
                  ,argument5);
          

          第二行應該是 8 個縮進而不是 4 個, 并且不應該以分隔符開頭.

          // GOOD
          doSomething(argument1, argument2, argument3, argument4,
                  argument5);
          

          規則14. 原始值

          字符串不應該使用單引號包裹.

          // BAD
          const description = 'this is a description';

          而應該使用雙引號.

          // GOOD
          const description = "this is a description";

          規則15. 使用 "undefined"

          不要使用全等運算符判斷變量是否為 undefined.

          // BAD
          if (variable === "undefined") {  
              // do something 
          }

          使用 typeof 操作符來查看一個變量是否已經定義.

          // GOOD
          if (typeof variable === "undefined") {  
              // do something 
          }

          因此, 遵循上述的這些規則, 可以讓你的 JavaScript 項目更加整潔.

          上述所有的規則都可以在 "編寫可維護的JavaScript" 這本書中找到. 所以即使你不同意其中的某些規則也沒關系. 因為編碼風格是多樣化的. 但是這些規則可以作為一個良好的起點.

          幾天保存了網絡上的一個頁面,瀏覽器打開后,發現是亂碼。如下圖:

          亂碼網頁

          出現這個問題怎么處理呢?下面幫你解決

          頁面html源碼

          查看html,看到這里用了國標標準,看源碼截圖

          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

          解決方法:

          把gb2312改成utf-8即可

          修改為utf-8

          修改后的結果,如圖:

          修改后的展示

          知識分享:

          utf-8 和gb3212 的區別

          utf-8 這個是國際通用字庫,支持各種不同的語言

          gb3212這個是中國的字庫,支持簡體中文和少數外語+一些符號,文件資源少一點

          區別:utf-8跨平臺兼容性更好,由于它字庫更全所以加載會慢好多

          html的charset屬性

          charset屬性是定義HTML文檔的字符編碼格式。

          常見的字符編碼有:Unicode、utf-8、gbk、gb2312

          其中:

          gbk是國家標準的擴展版(增加了繁體并包含所有亞洲字符集)

          Unicode是國際組織制定的旨在容納全球所有字符的編碼方案,包括字符集、編碼方案等。又稱為萬國碼、統一碼、單一碼

          篇文章適合任何一位基于JavaScript開發的開發者。我寫這篇文章主要涉及JavaScript中一些簡寫的代碼,幫助大家更好理解一些JavaScript的基礎。希望這些代碼能從不同的角度幫助你更好的理解JavaScript。

          三元操作符

          如果使用if...else語句,那么這是一個很好節省代碼的方式。

          Longhand:

          const x=20;
          let answer;
          if (x > 10) {
           answer='is greater';
          } else {
           answer='is lesser';
          }
          

          Shorthand:

          const answer=x > 10 ? 'is greater' : 'is lesser';
          

          你還可以像下面這樣嵌套if語句:

          const big=x > 10 ? " greater 10" : x
          

          Short-circuit Evaluation

          分配一個變量值到另一個變量的時候,你可能想要確保變量不是null、undefined或空。你可以寫一個有多個if的條件語句或者Short-circuit Evaluation。

          Longhand:

          if (variable1 !==null || variable1 !==undefined || variable1 !=='') {
           let variable2=variable1;
          }
          

          Shorthand:

          const variable2=variable1 || 'new';
          

          不要相信我,請先相信自己的測試(可以把下面的代碼粘貼在es6console)

          let variable1;
          let variable2=variable1 || '';
          console.log(variable2===''); // prints true
          variable1='foo';
          variable2=variable1 || '';
          console.log(variable2); // prints foo
          

          聲明變量

          在函數中聲明變量時,像下面這樣同時聲明多個變量可以節省你大量的時間和空間:

          Longhand:

          let x;
          let y;
          let x=3;
          

          Shorthand:

          let x, y, z=3;
          

          如果存在

          這可能是微不足道的,但值得提及。做“如果檢查”時,賦值操作符有時可以省略。

          Longhand:

          if (likeJavaScript===true)
          

          Shorthand:

          if (likeJavaScript)
          

          注:這兩種方法并不完全相同,簡寫檢查只要likeJavaScript是true都將通過。

          這有另一個示例。如果a不是true,然后做什么。

          Longhand:

          let a;
          if ( a !==true ) {
          // do something...
          }
          

          Shorthand:

          let a;
          if ( !a ) {
          // do something...
          }
          

          JavaScript的for循環

          如果你只想要原生的JavaScript,而不想依賴于jQuery或Lodash這樣的外部庫,那這個小技巧是非常有用的。

          Longhand:

          for (let i=0; i < allImgs.length; i++)
          

          Shorthand:

          for (let index in allImgs)
          

          Array.forEach簡寫:

          function logArrayElements(element, index, array) {
           console.log("a[" + index + "]=" + element);
          }
          [2, 5, 9].forEach(logArrayElements);
          // logs:
          // a[0]=2
          // a[1]=5
          // a[2]=9
          

          Short-circuit Evaluation

          如果參數是null或者是undefined,我們可以簡單的使用一個Short-circuit邏輯運算,實現一行代碼替代六行代碼的寫法。

          Longhand:

          let dbHost;
          if (process.env.DB_HOST) {
           dbHost=process.env.DB_HOST;
          } else {
           dbHost='localhost';
          }
          

          Shorthand:

          const dbHost=process.env.DB_HOST || 'localhost';
          

          十進制指數

          你可能看過這個。它本質上是一個寫數字的奇特寫法,就是一個數字后面有很多個0。例如1e7本質相當于10000000(1的后面有7個0)。它代表了十進制計數等于10000000。

          Longhand:

          for (let i=0; i < 10000; i++) {}
          

          Shorthand:

          for (let i=0; i < 1e7; i++) {}
          // All the below will evaluate to true
          1e0===1;
          1e1===10;
          1e2===100;
          1e3===1000;
          1e4===10000;
          1e5===100000;
          

          對象屬性

          定義對象文字(Object literals)讓JavaScript變得更有趣。ES6提供了一個更簡單的辦法來分配對象的屬性。如果屬性名和值一樣,你可以使用下面簡寫的方式。

          Longhand:

          const obj={ x:x, y:y };
          

          Shorthand:

          const obj={ x, y };
          

          箭頭函數

          經典函數很容易讀和寫,但它們確實會變得有點冗長,特別是嵌套函數中調用其他函數時還會讓你感到困惑。

          Longhand:

          function sayHello(name) {
           console.log('Hello', name);
          }
          setTimeout(function() {
           console.log('Loaded')
          }, 2000);
          list.forEach(function(item) {
           console.log(item);
          });
          

          Shorthand:

          sayHello=name=> console.log('Hello', name);
          setTimeout(()=> console.log('Loaded'), 2000);
          list.forEach(item=> console.log(item));
          

          隱式返回

          return在函數中經常使用到的一個關鍵詞,將返回函數的最終結果。箭頭函數用一個語句將隱式的返回結果(函數必須省略{},為了省略return關鍵詞)。

          如果返回一個多行語句(比如對象),有必要在函數體內使用()替代{}。這樣可以確保代碼是否作為一個單獨的語句返回。

          Longhand:

          function calcCircumference(diameter) {
           return Math.PI * diameter
          }
          

          Shorthand:

          calcCircumference=diameter=> (
           Math.PI * diameter;
          )
          

          默認參數值

          你可以使用if語句來定義函數參數的默認值。在ES6中,可以在函數聲明中定義默認值。

          Longhand:

          function volume(l, w, h) {
           if (w===undefined)
           w=3;
           if (h===undefined)
           h=4;
           return l * w * h;
          }
          

          Shorthand:

          volume=(l, w=3, h=4 )=> (l * w * h);
          volume(2) //output: 24
          

          Template Literals

          是不是厭倦了使用+來連接多個變量變成一個字符串?難道就沒有一個更容易的方法嗎?如果你能使用ES6,那么你是幸運的。在ES6中,你要做的是使用撇號和${},并且把你的變量放在大括號內。

          Longhand:

          const welcome='You have logged in as ' + first + ' ' + last + '.'
          const db='http://' + host + ':' + port + '/' + database;
          

          Shorthand:

          const welcome=`You have logged in as ${first} ${last}`;
          const db=`http://${host}:${port}/${database}`;
          

          Destructuring Assignment

          如果你正在使用任何一個流行的Web框架時,就有很多機會使用數組的形式或數據對象的形式與API之間傳遞信息。一旦數據對象達到一個對個組件時,你需要將其展開。

          Longhand:

          const observable=require('mobx/observable');
          const action=require('mobx/action');
          const runInAction=require('mobx/runInAction');
          const store=this.props.store;
          const form=this.props.form;
          const loading=this.props.loading;
          const errors=this.props.errors;
          const entity=this.props.entity;
          

          Shorthand:

          import { observable, action, runInAction } from 'mobx';
          const { store, form, loading, errors, entity }=this.props;
          

          你甚至可以自己指定變量名:

          const { store, form, loading, errors, entity:contact }=this.props;
          

          多行字符串

          你會發現以前自己寫多行字符串的代碼會像下面這樣:

          Longhand:

          const lorem='Lorem ipsum dolor sit amet, consectetur\n\t'
           + 'adipisicing elit, sed do eiusmod tempor incididunt\n\t'
           + 'ut labore et dolore magna aliqua. Ut enim ad minim\n\t'
           + 'veniam, quis nostrud exercitation ullamco laboris\n\t'
           + 'nisi ut aliquip ex ea commodo consequat. Duis aute\n\t'
           + 'irure dolor in reprehenderit in voluptate velit esse.\n\t'
          

          但還有一個更簡單的方法。使用撇號。

          Shorthand:

          const lorem=`Lorem ipsum dolor sit amet, consectetur
           adipisicing elit, sed do eiusmod tempor incididunt
           ut labore et dolore magna aliqua. Ut enim ad minim
           veniam, quis nostrud exercitation ullamco laboris
           nisi ut aliquip ex ea commodo consequat. Duis aute
           irure dolor in reprehenderit in voluptate velit esse.`
          

          Spread Operator

          Spread Operator是ES6中引入的,使JavaScript代碼更高效和有趣。它可以用來代替某些數組的功能。Spread Operator只是一個系列的三個點(...)。

          Longhand:

          // joining arrays
          const odd=[1, 3, 5];
          const nums=[2 ,4 , 6].concat(odd);
          // cloning arrays
          const arr=[1, 2, 3, 4];
          const arr2=arr.slice()
          

          Shorthand:

          // joining arrays
          const odd=[1, 3, 5 ];
          const nums=[2 ,4 , 6, ...odd];
          console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]
          // cloning arrays
          const arr=[1, 2, 3, 4];
          const arr2=[...arr];
          

          不像concat()函數,使用Spread Operator你可以將一個數組插入到另一個數組的任何地方。

          const odd=[1, 3, 5 ];
          const nums=[2, ...odd, 4 , 6];
          

          另外還可以當作解構符:

          const { a, b, ...z }={ a: 1, b: 2, c: 3, d: 4 };
          console.log(a) // 1
          console.log(b) // 2
          console.log(z) // { c: 3, d: 4 }
          

          強制參數

          默認情況下,JavaScript如果不給函數參數傳一個值的話,將會是一個undefined。有些語言也將拋出一個警告或錯誤。在執行參數賦值時,你可以使用if語句,如果未定義將會拋出一個錯誤,或者你可以使用強制參數(Mandatory parameter)。

          Longhand:

          function foo(bar) {
           if(bar===undefined) {
           throw new Error('Missing parameter!');
           }
           return bar;
          }
          

          Shorthand:

          mandatory=()=> {
           throw new Error('Missing parameter!');
          }
          foo=(bar=mandatory())=> {
           return bar;
          }
          

          Array.find

          如果你以前寫過一個查找函數,你可能會使用一個for循環。在ES6中,你可以使用數組的一個新功能find()。

          Longhand:

          const pets=[
           { type: 'Dog', name: 'Max'},
           { type: 'Cat', name: 'Karl'},
           { type: 'Dog', name: 'Tommy'},
          ]
          function findDog(name) {
           for(let i=0; i<pets.length; ++i) {
           if(pets[i].type==='Dog' && pets[i].name===name) {
           return pets[i];
           }
           }
          }
          

          Shorthand:

          pet=pets.find(pet=> pet.type==='Dog' && pet.name==='Tommy');
          console.log(pet); // { type: 'Dog', name: 'Tommy' }
          

          Object[key]

          你知道Foo.bar也可以寫成Foo[bar]吧。起初,似乎沒有理由應該這樣寫。然而,這個符號可以讓你編寫可重用代碼塊。

          下面是一段簡化后的函數的例子:

          function validate(values) {
           if(!values.first)
           return false;
           if(!values.last)
           return false;
           return true;
          }
          console.log(validate({first:'Bruce',last:'Wayne'})); // true
          

          這個函數可以正常工作。然而,需要考慮一個這樣的場景:有很多種形式需要應用驗證,而且不同領域有不同規則。在運行時很難創建一個通用的驗證功能。

          Shorthand:

          // object validation rules
          const schema={
           first: {
           required:true
           },
           last: {
           required:true
           }
          }
          // universal validation function
          const validate=(schema, values)=> {
           for(field in schema) {
           if(schema[field].required) {
           if(!values[field]) {
           return false;
           }
           }
           }
           return true;
          }
          console.log(validate(schema, {first:'Bruce'})); // false
          console.log(validate(schema, {first:'Bruce',last:'Wayne'})); // true
          

          現在我們有一個驗證函數,可以各種形式的重用,而不需要為每個不同的功能定制一個驗證函數。

          Double Bitwise NOT

          如果你是一位JavaScript新手的話,對于逐位運算符(Bitwise Operator)你應該永遠不會在任何地方使用。此外,如果你不處理二進制0和1,那就更不會想使用。

          然而,一個非常實用的用例,那就是雙位操作符。你可以用它替代Math.floor()。Double Bitwise NOT運算符有很大的優勢,它執行相同的操作要快得多。你可以在這里閱讀更多關于位運算符相關的知識。

          Longhand:

          Math.floor(4.9)===4 //true
          

          Shorthand:

          ~~4.9===4 //true
          

          原文來源: https://mp.weixin.qq.com/s/lUIyQZM3egZqX5S29fF3iw


          主站蜘蛛池模板: 国产传媒一区二区三区呀| 无码欧精品亚洲日韩一区| 好爽毛片一区二区三区四无码三飞 | 熟女精品视频一区二区三区| 国模无码视频一区二区三区| 久久99精品国产一区二区三区| 日本韩国一区二区三区| 亚洲视频在线一区二区三区| 中文字幕色AV一区二区三区| 国产精品伦子一区二区三区| 在线精品视频一区二区| 99精品一区二区免费视频| 国产人妖视频一区二区| 国产高清精品一区| 国产日韩综合一区二区性色AV| 国产精品揄拍一区二区| 日韩内射美女人妻一区二区三区 | 亚洲国产老鸭窝一区二区三区 | 欲色aV无码一区二区人妻 | 国产一区二区三区影院| 日本内射精品一区二区视频 | 中文字幕av日韩精品一区二区 | 国内精品视频一区二区三区| 2018高清国产一区二区三区| 精品亚洲AV无码一区二区| 中文字幕精品一区二区日本| 91精品一区二区三区在线观看| 国产一区在线视频| 亚洲日韩国产精品第一页一区| 综合一区自拍亚洲综合图区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 久热国产精品视频一区二区三区| 无码av免费毛片一区二区| 中文字幕乱码人妻一区二区三区| 亚洲视频一区在线| 日韩人妻一区二区三区免费| 亚洲一区综合在线播放| 偷拍激情视频一区二区三区| 亚洲日韩AV无码一区二区三区人| 欧美av色香蕉一区二区蜜桃小说| 国产伦理一区二区三区|