30分鐘掌握ES6/ES2015核心內容

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。

也就是說,ES6就是ES2015。

雖然目前并不是所有瀏覽器都能兼容ES6全部特性,但越來越多的程序員在實際項目當中已經開始使用ES6了。所以就算你現在不打算使用ES6,但為了看懂別人的你也該懂點ES6的語法了...

在我們正式講解ES6語法之前,我們得先了解下Babel。
Babel

Babel是一個廣泛使用的ES6轉碼器,可以將ES6代碼轉為ES5代碼,從而在現有環境執行。大家可以選擇自己習慣的工具來使用使用Babel,具體過程可直接在Babel官網查看:
110219_5536_3460260.png

最常用的ES6特性

let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments
這些是ES6最常用的幾個語法,基本上學會它們,我們就可以走遍天下都不怕啦!我會用最通俗易懂的語言和例子來講解它們,保證一看就懂,一學就會。

let, const

這兩個的用途與var類似,都是用來聲明變量的,但在實際運用中他倆都有各自的特殊用途。
首先來看下面這個例子:

var name = 'zach'while (true) {var name = 'obama'console.log(name)  //obamabreak
}console.log(name)  //obama

使用var 兩次輸出都是obama,這是因為ES5只有全局作用域和函數作用域,沒有塊級作用域,這帶來很多不合理的場景。第一種場景就是你現在看到的內層變量覆蓋外層變量。而let則實際上為JavaScript新增了塊級作用域。用它所聲明的變量,只在let命令所在的代碼塊內有效。

let name = 'zach'while (true) {let name = 'obama'console.log(name)  //obamabreak
}console.log(name)  //zach

另外一個var帶來的不合理場景就是用來計數的循環變量泄露為全局變量,看下面的例子:

var a = [];
for (var i = 0; i < 10; i++) {a[i] = function () {console.log(i);};
}
a[6](); // 10

上面代碼中,變量i是var聲明的,在全局范圍內都有效。所以每一次循環,新的i值都會覆蓋舊值,導致最后輸出的是最后一輪的i的值。而使用let則不會出現這個問題。

var a = [];
for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);};
}
a[6](); // 6

再來看一個更常見的例子,了解下如果不用ES6,而用閉包如何解決這個問題。

var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){clickBoxs[i].onclick = function(){console.log(i)}
}

我們本來希望的是點擊不同的clickBox,顯示不同的i,但事實是無論我們點擊哪個clickBox,輸出的都是5。下面我們來看下,如何用閉包搞定它。

function iteratorFactory(i){var onclick = function(e){console.log(i)}return onclick;
}
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){clickBoxs[i].onclick = iteratorFactory(i)
}

const也用來聲明變量,但是聲明的是常量。一旦聲明,常量的值就不能改變。

const PI = Math.PIPI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only

當我們嘗試去改變用const聲明的常量時,瀏覽器就會報錯。
const有一個很好的應用場景,就是當我們引用第三方庫的時聲明的變量,用const來聲明可以避免未來不小心重命名而導致出現bug:

const monent = require('moment')

class, extends, super

這三個特性涉及了ES5中最令人頭疼的的幾個部分:原型、構造函數,繼承...你還在為它們復雜難懂的語法而煩惱嗎?你還在為指針到底指向哪里而糾結萬分嗎?

有了ES6我們不再煩惱!

ES6提供了更接近傳統語言的寫法,引入了Class(類)這個概念。新的class寫法讓對象原型的寫法更加清晰、更像面向對象編程的語法,也更加通俗易懂。

class Animal {constructor(){this.type = 'animal'}says(say){console.log(this.type + ' says ' + say)}
}let animal = new Animal()
animal.says('hello') //animal says helloclass Cat extends Animal {constructor(){super()this.type = 'cat'}
}let cat = new Cat()
cat.says('hello') //cat says hello

上面代碼首先用class定義了一個“類”,可以看到里面有一個constructor方法,這就是構造方法,而this關鍵字則代表實例對象。簡單地說,constructor內定義的方法和屬性是實例對象自己的,而constructor外定義的方法和屬性則是所有實例對象可以共享的。

Class之間可以通過extends關鍵字實現繼承,這比ES5的通過修改原型鏈實現繼承,要清晰和方便很多。上面定義了一個Cat類,該類通過extends關鍵字,繼承了Animal類的所有屬性和方法。

super關鍵字,它指代父類的實例(即父類的this對象)。子類必須在constructor方法中調用super方法,否則新建實例時會報錯。這是因為子類沒有自己的this對象,而是繼承父類的this對象,然后對其進行加工。如果不調用super方法,子類就得不到this對象。

ES6的繼承機制,實質是先創造父類的實例對象this(所以必須先調用super方法),然后再用子類的構造函數修改this。

P.S 如果你寫react的話,就會發現以上三個東西在最新版React中出現得很多。創建的每個component都是一個繼承React.Component的類。詳見react文檔

arrow function

這個恐怕是ES6最最常用的一個新特性了,用它來寫function比原來的寫法要簡潔清晰很多:

function(i){ return i + 1; } //ES5
(i) => i + 1 //ES6

簡直是簡單的不像話對吧...
如果方程比較復雜,則需要用{}把代碼包起來:

function(x, y) { x++;y--;return x + y;
}
(x, y) => {x++; y--; return x+y}

除了看上去更簡潔以外,arrow function還有一項超級無敵的功能!
長期以來,JavaScript語言的this對象一直是一個令人頭痛的問題,在對象方法中使用this,必須非常小心。例如:

class Animal {constructor(){this.type = 'animal'}says(say){setTimeout(function(){console.log(this.type + ' says ' + say)}, 1000)}
}var animal = new Animal()animal.says('hi')  //undefined says hi

運行上面的代碼會報錯,這是因為setTimeout中的this指向的是全局對象。所以為了讓它能夠正確的運行,傳統的解決方法有兩種:

  1. 第一種是將this傳給self,再用self來指代this

       says(say){var self = this;setTimeout(function(){console.log(self.type + ' says ' + say)}, 1000)

    2.第二種方法是用bind(this),即

       says(say){setTimeout(function(){console.log(this.type + ' says ' + say)}.bind(this), 1000)

    但現在我們有了箭頭函數,就不需要這么麻煩了:

class Animal {constructor(){this.type = 'animal'}says(say){setTimeout( () => {console.log(this.type + ' says ' + say)}, 1000)}
}var animal = new Animal()animal.says('hi')  //animal says hi

當我們使用箭頭函數時,函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。
并不是因為箭頭函數內部有綁定this的機制,實際原因是箭頭函數根本沒有自己的this,它的this是繼承外面的,因此內部的this就是外層代碼塊的this。

template string

這個東西也是非常有用,當我們要插入大段的html內容到文檔中時,傳統的寫法非常麻煩,所以之前我們通常會引用一些模板工具庫,比如mustache等等。

大家可以先看下面一段代碼:

$("#result").append("There are <b>" + basket.count + "</b> " +"items in your basket, " +"<em>" + basket.onSale +"</em> are on sale!"
);

我們要用一堆的'+'號來連接文本與變量,而使用ES6的新特性模板字符串``后,我們可以直接這么來寫:

$("#result").append(`There are <b>${basket.count}</b> itemsin your basket, <em>${basket.onSale}</em>are on sale!
`);

用反引號(\來標識起始,用${}`來引用變量,而且所有的空格和縮進都會被保留在輸出之中,是不是非常爽?!

React Router從第1.0.3版開始也使用ES6語法了,比如這個例子:

<Link to={`/taco/${taco.name}`}>{taco.name}</Link>

React Router

destructuring

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

看下面的例子:

let cat = 'ken'
let dog = 'lili'
let zoo = {cat: cat, dog: dog}
console.log(zoo)  //Object {cat: "ken", dog: "lili"}

用ES6完全可以像下面這么寫:

let cat = 'ken'
let dog = 'lili'
let zoo = {cat, dog}
console.log(zoo)  //Object {cat: "ken", dog: "lili"}

反過來可以這么寫:

let dog = {type: 'animal', many: 2}
let { type, many} = dog
console.log(type, many)   //animal 2

default, rest

default很簡單,意思就是默認值。大家可以看下面的例子,調用animal()方法時忘了傳參數,傳統的做法就是加上這一句type = type || 'cat' 來指定默認值。

function animal(type){type = type || 'cat'  console.log(type)
}
animal()

如果用ES6我們而已直接這么寫:

function animal(type = 'cat'){console.log(type)
}
animal()

最后一個rest語法也很簡單,直接看例子:

function animals(...types){console.log(types)
}
animals('cat', 'dog', 'fish') //["cat", "dog", "fish"]

而如果不用ES6的話,我們則得使用ES5的arguments

總結

以上就是ES6最常用的一些語法,可以說這20%的語法,在ES6的日常使用中占了80%...

轉載于:https://my.oschina.net/u/3460260/blog/1587187

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows 11 22H2 22621.290 和 22622.290 推送

面向 Beta 頻道的 Windows 預覽體驗成員&#xff0c;微軟現已推送 Windows 11 預覽版 Build 22621.290 和 22622.290。微軟宣布 Beta 頻道Windows 11 預覽版啟用全新體驗&#xff0c;分為兩組進行測試。通過兩組 Windows 預覽體驗成員的使用數據和反饋&#xff0c;以更好的測試…

js數組中的find、filter、sort

準備測試數據 var data [{name:"Jackie",id: "122"}, {name:"Tony2",id: "121"}, {name:"Tony",id: "121"}]; find 查找 返回第一個符合條件的結果 data.find(user>user.id121)--結果 {name: "Tony2&q…

【ArcGIS Pro微課1000例】0012:ArcGIS Pro屬性表中文亂碼完美解決辦法匯總

如圖所示,安裝完ArcGIS Pro后,由于計算機系統和應用軟件字符編碼的問題,導致加載矢量數據并打開屬性表后,會發現中文字段出現了亂碼。 屬性表中文亂碼: 屬性表中文正常: 事實上,ArcMap中也會出現中文屬性表亂碼的情況。 亂碼的出現會給學習和工作帶來很大不便,因此本…

C語言試題178之實現分塊查找算法,索引順序查找算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 例如,…

dubbo中的Filter順序是如何確定的

2019獨角獸企業重金招聘Python工程師標準>>> 服務提供方的過濾器被調用順序&#xff1a; EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->(這4個是在代碼中指定的) ExceptionFilter-> TimeoutFilter ->MonitorFilter-> TraceF…

java提示找不到或無法加載主類

背景 默許jdk的配置大家都沒有問題&#xff0c;執行java&#xff0c;javac無報錯&#xff0c;但今天在嘗試在本地起來kafka的時候&#xff0c;提示java 找不到或無法加載主類&#xff0c;然后日志中提示 Files 找不到或無法加載主類&#xff1b;C:\Program 分析 其實很輕松的猜…

Dapr v1.8 正式發布

Dapr是一套開源、可移植的事件驅動型運行時&#xff0c;允許開發人員輕松立足云端與邊緣位置運行彈性、微服務、無狀態以及有狀態等應用程序類型。Dapr能夠確保開發人員專注于編寫業務邏輯&#xff0c;而不必分神于解決分布式系統難題&#xff0c;由此顯著提高生產力并縮短開發…

[轉]WebView長按彈出復制粘貼

ActionMode簡介 ActionMode是android3.0之后出現的一種菜單選擇模式 ActionMode的創建 ActionMode的使用特別的簡單&#xff0c;主要用到兩個方法&#xff0c;startActionMode和ActionMode.Callback()&#xff0c;startActionMode:開啟我們的菜單&#xff0c;ActionMode.Cal…

深夜爆肝:萬字長文3種語言實現Huffman樹(強烈建議三連)

文章目錄一、C語言能干大事1. C語言下Huffman樹的計算過程分析2. C語言下Huffman樹的編程二、C#語言也不賴1. C#下Huffman類的設計2. C#中界面設計3. 建立測試數據并顯示Huffman樹4. 輸入任意一組數據&#xff0c;完成構造Huffman樹三、JavaScript語言不愛聽了1. JavaScript下H…

C語言試題179之實現堆排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現堆…

SQL Server Update 所有表的某一列(列名相同,類型相同)數值

DECLARE sql VARCHAR(5000); WITH T AS (SELECT SchemaName c.TABLE_SCHEMA,TableName c.TABLE_NAME,ColumnName c.COLUMN_NAME,DataType DATA_TYPE,sql update c.TABLE_NAME set c.COLUMN_NAME 2017-11-20 -----------執行語句FROM INFORMATION_SCHEMA.COLUMNS …

C語言試題180之實現實現字符串strcpy函數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現字…

[轉]關于數據中臺、數據平臺、數據倉庫、數據湖等數據概念的對比解析

前言 2010年左右&#xff0c;還是在上學的時候&#xff0c;學過一門課程叫《數據倉庫與數據挖掘》&#xff0c;那還是屬于傳統數據的時代&#xff0c;我們會討論什么是數據倉庫&#xff1f;什么是數據集市&#xff1f;數據倉庫和數據庫有什么區別&#xff1f;等等&#xff0c;…

【微服務專題之】.Net6下集成消息隊列-RabbitMQ交換機模式代碼演示(全)

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注].Net中RabbitMQ中交換機模式的使用前文回顧【微服務專題之】.Net6下集成消息隊列上-RabbitMQ【微服務專題…

【專升本計算機】甘肅省專升本計算機基礎--判斷題--匯編(737道帶答案)

馮?諾依曼原理是計算機的唯一工作原理。(  )計算機能直接識別匯編語言程序。(  )計算機能直接執行高級語言源程序。(  )計算機掉電后,ROM中的信息會丟失。(  )計算機掉電后,外存中的信息會丟失。( √ )應用軟件的作用是擴大計算機的存儲容量。(  )操…

thinkphp中表有前綴名的時候申明模板的方法

$Modelnew \Home\Model\Stu_activityModel; $ModelD(Stu_activity);//錯誤的聲明不了轉載于:https://www.cnblogs.com/jianxin-lilang/p/6242416.html

OK335xS psplash make-image-header.sh hacking

/****************************************************************************** OK335xS psplash make-image-header.sh hacking* 說明&#xff1a;* 移植的時候想知道移植psplash中./make-image-header.sh Screenshot.png POKY* 最后的POKY為什么要指定&am…

SDWebImage 4 0 遷移指南

剛剛更新pods 編譯程序,突然發現SDWebImage報錯 了解到SDWebImage4.0 更換了不少方法&#xff0c;還增加了幾個類&#xff0c;索性都研究一下pod 更新SDWebImage版本為4.1.0 查找是否有對應緩存的 方法 由返回BOOL 值 換成Block回調中參數返回BOOL值 //老版本 BOOL isInCache …

C語言試題181之實現strcat函數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

通宵爆肝:C語言下的平衡二叉樹(Avl)原來如此簡單!

文章目錄平衡二叉樹的構造過程1 算法描述平衡二叉樹的編程1 樹上結點的高度計算2 LL調整函數3 RR調整函數4 LR調整函數5 RL調整函數6 根據結點的值、動態構造平衡二叉樹平衡二叉樹的構造過程 對一個查找問題而言&#xff0c;查找表的存儲結構、應該組織成二叉樹結構。而把一個…