<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          都2021年了,再不學ES6你就out了 —— 一文搞懂ES6

          2021-6-3    前端達人

          導語:ES6是什么?用來做什么?

          • ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個版本標準,2015.06 發版

          • 雖然15年就有正式版本了,但是國內普遍商用是在2018年之后去了,甚至到現在有很多前端仍然搞不懂ES6(都2021年了,兄dei~)
            在這里插入圖片描述

          • ES6 的出現主要是為了解決 ES5 的先天不足,比如 JavaScript 里并沒有類的概念

          • 目前存在少數低版本瀏覽器的 JavaScript 是 ES5 版本,大多數的瀏覽器已經支持 ES6

          • ES6提供了大量的語法糖,讓你寫代碼的時候簡直不要太爽!

          • 你必須要知道的是:現在各企業都普遍使用,不會ES6意味著你很難找到工作,上班了你連別人的代碼都看不懂
            在這里插入圖片描述

          1. let 與 const

          1.1 let 與 var

          • let:ES6新增,用于聲明變量,有塊級作用域
          • var:ES5中用于聲明變量的關鍵字,存在各種問題(例如:紅杏出墻~)
          • 如果你的代碼里還存在 var,那你的良心就大大的壞了!

          var存在的問題:

           // 1.聲明提升 // 此處會正常打印,但這是錯誤的(屬于先上車后買票了?。?/span> console.log(name); var name = "大帥比"; // 2. 變量覆蓋 var demo = "小明"; var demo = "小紅"; // 此處會打印小紅,這也是錯誤的(屬于套牌車,違法的啊,兄弟) // 同一個項目中,發生變量覆蓋可能會導致數據丟失以及各種不可預知的bug,原則上來說:變量不能重名 console.log(demo) // 3. 沒有塊級作用域 function fn2(){ for(var i = 0; i < 5; i++){ // do something } // 此處會正常打印出 i 的值,這是錯誤的 // i是定義在循環體之內的,只能在循環體內打印,當前現象叫做紅杏出墻?。?! console.log(i); } fn2(); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22

          let不會存在上述問題:

           // 1. 不會存在聲明提前 // 此處會報錯(這里必須報錯,原則上來說不能先上車后買票) console.log(name); let name = "大帥比"; // 2. 不會有變量覆蓋 let demo = "小明"; let demo = "小紅"; // 此處會報錯(不能使用套牌車?。└嬖V你已經定義了此變量。避免了項目中存在變量覆蓋的問題 console.log(demo) // 3. 有塊級作用域 function fn2(){ for(let i = 0; i < 5; i++){ // do something } // 此處會報錯,無法打印,防止紅杏出墻?。?! // i是定義在循環體之內的,循環體外當然無法打印  console.log(i); } fn2(); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21

          const

          • const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變
          • 一般用于全局變量
          • 通常變量名全部大寫(請按照規則來,不要亂搞,容易出事情)
          const PI = "3.1415926"; 
          
          • 1

          2. 解構賦值

          • 解構賦值是對賦值運算符的擴展
          • 針對數組或者對象進行模式匹配,然后對其中的變量進行賦值
          • 代碼簡潔且易讀,語義更加清晰明了,方便了復雜對象中數據字段獲?。?span style="box-sizing:border-box;outline:0px;user-select:text !important;font-weight:700;overflow-wrap:break-word;">簡而言之:用起來很爽!)

          在這里插入圖片描述

          2.1 用在數組上

          let [a, b, c] = [1, 2, 3]; // a = 1,b = 2,c = 3 相當于重新定義了變量a,b,c,取值也更加方便 // , = 占位符 let arr = ["小明", "小花", "小魚", "小豬"]; let [,,one] = arr; // 這里會取到小魚 // 解構整個數組 let strArr = [...arr]; // 得到整個數組 console.log(strArr); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11

          2.2 用在對象上

          let obj = { className : "卡西諾", age: 18 } let {className} = obj; // 得到卡西諾 let {age} = obj; // 得到18 // 剩余運算符 let {a, b, ...demo} = {a: 1, b: 2, c: 3, d: 4}; // a = 1 // b = 2 // demo = {c: 3, d: 4} 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          3. 模板字符串

          • 模板字符串相當于加強版的字符串,用反引號 ``
          • 除了作為普通字符串,還可以用來定義多行字符串,可以在字符串中加入變量和表達式

          3.1 普通字符串

          // 普通字符串 let string = "hello"+"小兄弟"; // hello小兄弟 // 如果想要換行 let string = "hello'\n'小兄弟" // hello // 小兄弟 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          3.2 模板字符串

          let str1 = "穿堂而過的"; let str2 = "風"; // 模板字符串 let newStr = `我是${str1}${str2}`; // 我是穿堂而過的風 console.log(newStr) // 字符串中調用方法 function fn3(){ return "帥的不行!"; } let string2= `我真是${fn3 ()}`; console.log(string2); // 我真是帥的不行! 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13

          4. ES6 函數(升級后更爽)

          4.1 箭頭函數

          • 箭頭函數是一種更加簡潔的函數書寫方式
          • 箭頭函數本身沒有作用域(無this)
          • 箭頭函數的this指向上一層,上下文決定其this
          • 基本語法:參數 => 函數體

          a. 基本用法

          let fn = v => v;
          //等價于
          let fn = function(num){
           return num;
          }
          fn(100);  // 輸出100 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          b. 帶參數的寫法

          let fn2 = (num1,num2) => {
           let result = num1 + num2;
           return result;
          }
          fn2(3,2);  // 輸出5 
          
          • 1
          • 2
          • 3
          • 4
          • 5

          c. 箭頭函數中的this指向問題

          • 箭頭函數體中的 this 對象,是定義函數時的對象,而不是使用函數時的對象。在函數定義的時候就已經決定了
          function fn3(){
            setTimeout(()=>{
              // 定義時,this 綁定的是 fn3 中的 this 對象
              console.log(this.a);
            },0)
          }
          var a = 10;
          // fn3 的 this 對象為 {a: 10},因為它指向全局: window.a
          fn3.call({a: 18});  // 改變this指向,此時 a = 18 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          d. 箭頭函數適用的場景

          • 當我們代碼里存在這樣的代碼:let self = this;
          • 需要新建變量去保存this的時候
          • 案例如下:
          let Person1 = {
              'age': 18,
              'sayHello': function () {
                setTimeout(()=>{
                  console.log(this.age);
                });
              }
          };
          var age = 20;
          Person1.sayHello();  // 18 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          4.2 函數參數的擴展

          1. 默認參數

          // num為默認參數,如果不傳,則默認為10 function fn(type, num=10){ console.log(type, num); } fn(1); // 打印 1,10 fn(1,2); // 打印 1,2 (此值會覆蓋默認參數10) 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 需要注意的是:只有在未傳遞參數,或者參數為 undefined 時,才會使用默認參數,null 值被認為是有效的值傳遞。

          2. 不定參數

          // 此處的values是不定的,且無論你傳多少個 function f(...values){ console.log(values.length); } f(1,2); // 2 f(1,2,3,4); // 4 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          在這里插入圖片描述

          5. Class類

          • class (類)作為對象的模板被引入,可以通過 class 關鍵字定義類
          • class 的本質是 function,同樣可以看成一個塊
          • 可以看作一個語法糖,讓對象原型的寫法更加清晰
          • 更加標準的面向對象編程語法

          5.1 類的定義

          // 匿名類 let Demo = class { constructor(a) { this.a = a; } } // 命名類 let Demo = class Demo { constructor(a) { this.a = a; } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          5.2 類的聲明

          class Demo { constructor(a) { this.a = a; } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 請注意,類不能重復聲明
          • 類定義不會被提升,必須在訪問前對類進行定義,否則就會報錯。
          • 類中方法不需要 function 關鍵字。
          • 方法間不能加分號

          5.3 類的主體

          • 公共屬性(依然可以定義在原型上)
          class Demo{} Demo.prototype.a = 2; 
          
          • 1
          • 2
          • 實例屬性
          class Demo { a = 2; constructor () { console.log(this.a); } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 方法:constructor
          class Demo{ constructor(){ console.log('我是構造器'); } } new Demo(); // 我是構造器 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          如果不寫constructor,也會默認添加

          5.4 實例化對象

          class Demo { constructor(a, b) { this.a = a; this.b = b; console.log('Demo'); } sum() { return this.a + this.b; } } let demo1 = new Demo(2, 1); let demo2 = new Demo(3, 1); // 兩者原型鏈是相等的 console.log(demo1._proto_ == demo2._proto_); // true demo1._proto_.sub = function() { return this.a - this.b; } console.log(demo1.sub()); // 1 console.log(demo2.sub()); // 2 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20

          6. Map()

          6.1 Maps 和 Objects 的區別

          • 一個 Object 的鍵只能是字符串或者 Symbols,但一個 Map 的鍵可以是任意值
          • Map 中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是
          • Map 的鍵值對個數可以從 size 屬性獲取,而 Object 的鍵值對個數只能手動計算
            在這里插入圖片描述

          6.2 Map中的key

          // 1. key是字符串 let myMap = new Map(); let keyString = "string"; myMap.set(keyString, "和鍵'string'關聯的值"); // keyString === 'string' myMap.get(keyString); // "和鍵'string'關聯的值" myMap.get("string"); // "和鍵'string'關聯的值" // 2.key是對象 let myMap = new Map(); let keyObj = {}, myMap.set(keyObj, "和鍵 keyObj 關聯的值"); myMap.get(keyObj); // "和鍵 keyObj 關聯的值" myMap.get({}); // undefined, 因為 keyObj !== {} // 3. key也可以是函數或者NaN  
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          6.3 Map 的迭代

          // 1.使用 forEach let myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); // 0 = zero , 1 = one myMap.forEach(function(value, key) { console.log(key + " = " + value); }, myMap) // 2. 也可以使用 for...of 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11

          6.4 Map 與 Array的轉換

          letkvArray = [["key1", "value1"], ["key2", "value2"]]; // Map 構造函數可以將一個 二維 鍵值對數組轉換成一個 Map 對象 let myMap = new Map(kvArray); // 使用 Array.from 函數可以將一個 Map 對象轉換成一個二維鍵值對數組 let outArray = Array.from(myMap); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          6.5 關于map的重點面試題

          • 請談一下 Map和ForEach 的區別(問到map,必定問到此題)

          詳細解析:

          1. forEach()方法不會返回執行結果,而是undefined
          2. map()方法會得到一個新的數組并返回
          3. 同樣的一組數組,map()的執行速度優于 forEach()(map() 底層做了深度優化

          性質決定了兩者應用場景的不同

          • forEach() 適合于你并不打算改變數據的時候,而只是想用數據做一些事情(比如存入數據庫)
          let arr = ['a', 'b', 'c', 'd']; arr.forEach((val) => { console.log(val); // 依次打印出 a,b,c,d }); 
          
          • 1
          • 2
          • 3
          • 4
          • map() 適用于你要改變數據值的時候,它更快,而且返回一個新的數組

          let arr = [1, 2, 3, 4, 5]; let arr2 = arr.map(num => num * 2).filter(num => num > 5); // arr2 = [6, 8, 10]



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          部分借鑒自:csdn  

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合