国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

ES6的新特性概覽

2019-11-20 10:25:27
字體:
來源:轉載
供稿:網友

Nick Justice是GitHub開發者計劃的一員。早在ES6語言標準發布之前,他就借助像Babel這樣的轉譯器以及最新版本的瀏覽器在自己的項目中使用ES6特性。他認為,ES6的新特性將極大地改變JavaScript的編寫方式。

ES6(ECMAScript 6)是即將到來的新版本JavaScript語言的標準,代號harmony(和諧之意,顯然沒有跟上我國的步伐,我們已經進入中國夢版本了)。上一次標準的制訂還是2009年出臺的ES5。目前ES6的標準化工作正在進行中,預計會在14年12月份放出正式敲定的版本。但大部分標準已經就緒,且各瀏覽器對ES6的支持也正在實現中。

技術雖然發展太快,但是我們不停下學習的步伐,就不會被新技術淘汰,下面我們一起來學習es6的新特征吧。

箭頭操作符

如果你會C#或者Java,你肯定知道lambda表達式,ES6中新增的箭頭操作符=>便有異曲同工之妙。它簡化了函數的書寫。操作符左邊為輸入的參數,而右邊則是進行的操作以及返回的值Inputs=>outputs。

我們知道在JS中回調是經常的事,而一般回調又以匿名函數的形式出現,每次都需要寫一個function,甚是繁瑣。當引入箭頭操作符后可以方便地寫回調了。請看下面的例子:

var array = [1,2,3];// 傳統寫法寫法array.forEach(function(v) {console.log(v);});// ES6寫法array.forEach(v => console.log(v)); 

類的支持

ES6中添加了對類的支持,引入了class關 鍵字(其實class在JavaScript中一直是保留字,目的就是考慮到可能在以后的新版本中會用到,現在終于派上用場了)。JS本身就是面向對象 的,ES6中提供的類實際上只是JS原型模式的包裝。現在提供原生的class支持后,對象的創建,繼承更加直觀了,并且父類方法的調用,實例化,靜態方 法和構造函數等概念都更加形象化。

下面代碼展示了類在ES6中的使用:

// 類的定義class Animal {// ES6中新型構造器constructor(name) {this.name = name;}// 實例方法sayName() {console.log('My name is ' + this.name);}}// 類的繼承class Programmer extends Animal {constructor(name) {// 直接調用父類構造器進行初始化super(name);}program() {console.log("I'm coding...");}}// 測試我們的類var animal = new Animal('dummy'),wayou = new Programmer('wayou');animal.sayName(); // 輸出 'My name is dummy'wayou.sayName(); // 輸出 'My name is wayou'wayou.program(); // 輸出 'I'm coding...' 

增強的對象字面量

對象字面量被增強了,寫法更加簡潔與靈活,同時在定義對象的時候能夠做的事情更多了。具體表現在:

1.可以在對象字面量里面定義原型

2.定義方法可以不用function關鍵字

3.直接調用父類方法

這樣一來,對象字面量與前面提到的類概念更加吻合,在編寫面向對象的JavaScript時更加輕松方便了。

// 通過對象字面量創建對象var human = { breathe() {console.log('breathing...');}};var worker = { __proto__: human, // 設置此對象的原型為human, 相當于繼承humancompany: 'freelancer',work() {console.log('working...');}};human.breathe(); // 輸出 'breathing...'// 調用繼承來的breathe方法worker.breathe(); // 輸出 'breathing...' 

字符串模板

字符串模板相對簡單易懂些。ES6中允許使用反引號 ` 來創建字符串,此種方法創建的字符串里面可以包含由美元符號加花括號包裹的變量 ${vraible}。如果你使用過像C#等后端強類型語言的話,對此功能應該不會陌生。

// 產生一個隨機數var num = Math.random();// 將這個數字輸出到console console.log(`your num is ${num}`);

解構

自動解析數組或對象中的值。比如若一個函數要返回多個值,常規的做法是返回一個對象,將每個值做為這個對象的屬性返回。但在ES6中,利用解構這一特性,可以直接返回一個數組,然后數組中的值會自動被解析到對應接收該值的變量中。

function getVal() {return[1,2];}var [x,y] = getVal(), // 函數返回值的解構console.log('x:' + x + ', y:' + y); // 輸出:x:1, y:2[name,,age] = ['wayou','male','secrect']; // 數組解構console.log('name:' + name + ', age:' + age); //輸出:name:wayou, age:secrect 

參數默認值,不定參數,拓展參數

默認參數值

現在可以在定義函數的時候指定參數的默認值了,而不用像以前那樣通過邏輯或操作符來達到目的了。

function sayHello(name) {// 傳統的指定默認參數的方式var name = name || 'dude';console.log('Hello ' + name);} sayHello(); // 輸出:Hello dudesayHello('Wayou'); // 輸出:Hello Wayou// 運用ES6的默認參數function sayHello2(name = 'dude') {console.log(`Hello${name}`);}sayHello2(); // 輸出:Hello dudesayHello2('Wayou'); // 輸出:Hello Wayou 

不定參數

不定參數是在函數中使用命名參數同時接收不定數量的未命名參數。這只是一種語法糖,在以前的JavaScript代碼中我們可以通過arguments變量來達到這一目的。不定參數的格式是三個句點后跟代表所有不定參數的變量名。

比如下面這個例子中,…x代表了所有傳入add函數的參數。

// 將所有參數相加的函數function add(...x) {return x.reduce((m,n) => m+n);}// 傳遞任意個數的參數console.log(add(1,2,3)); // 輸出:6console.log(add(1,2,3,4,5)); // 輸出:15 

拓展參數

拓展參數則是另一種形式的語法糖,它允許傳遞數組或者類數組直接做為函數的參數而不用通過apply。

var people = ['Wayou','John','Sherlock'];// sayHello函數本來接收三個單獨的參數人一,人二和人三function sayHello(people1, people2, people3) {console.log(`Hello${people1}, ${people2}, ${people3}`);}// 但是我們將一個數組以拓展參數的形式傳遞,它能很好地映射到每個單獨的參數sayHello(...people); // 輸出:Hello Wayou,John,Sherlock// 而在以前,如果需要傳遞數組當參數,我們需要使用函數的apply方法sayHello.apply(null, people); // 輸出:Hello Wayou,John,Sherlock 

let與const 關鍵字

可以把let看成var,只是它定義的變量被限定在了特定范圍內才能使用,而離開這個范圍則無效。const則很直觀,用來定義常量,即無法被更改值的變量。

for (let i=0; i<2; i++) {console.log(i); // 輸出: 0,1}console.log(i); // 輸出:undefined,嚴格模式下會報錯 

for of 值遍歷

我們都知道for in循環用于遍歷數組,類數組或對象,ES6中新引入的for of循環功能相似,不同的是每次循環它提供的不是序號而是值。

var someArray = ["a","b","c"];for (v of someArray) {console.log(v); // 輸出 a,b,c} 

iterator, generator

1.iterator: 它是這么一個對象,擁有一個next方法,這個方法返回一個對象{done,value},這個對象包含兩個屬性,一個布爾類型的done和包含任意值的value

2.iterable: 這是這么一個對象,擁有一個obj[@@iterator]方法,這個方法返回一個iterator

3.generator: 它是一種特殊的iterator。反的next方法可以接收一個參數并且返回值取決與它的構造函數(generator function)。generator同時擁有一個throw方法

4.generator函數: 即generator的構造函數。此函數內可以使用yield關鍵字。在yield出現的地方可以通過generator的next或throw方法向外界傳遞值。generator 函數是通過function*來聲明的

5.yield關鍵字:它可以暫停函數的執行,隨后可以再進進入函數繼續執行

模塊

在ES6標準中,JavaScript原生支持module了。這種將JS代碼分割成不同功能的小塊進行模塊化的概念是在一些三方規范中流行起來的,比如CommonJS和AMD模式。

將不同功能的代碼分別寫在不同文件中,各模塊只需導出公共接口部分,然后通過模塊的導入的方式可以在其他地方使用。

// point.jsmodule "point" {export class Point {constructor(x,y) {public x=x;public y=y;}}}// myapp.js// 聲明引用的模塊 module point from "/point.js";// 這里可以看出,盡管聲明了引用的模塊,還是可以通過指定需要的部分進行導入import Point from "point";var origin = new Point(0,0);console.log(origin); Map,Set 和 WeakMap,WeakSet

這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用hasOwnProperty來檢查某個屬性是屬于原型鏈上的呢還是當前對象的。同時,在進行屬性值添加與獲取時有專門的get,set方法。

// Sets var s = new Set();s.add("hello").add("goodbye");s.size === 2;s.has("hello") === true;// Mapsvar m = new Map();m.set("hello", 42);m.set(s, 34);m.get(s) == 34; 有時候我們會把對象作為一個對象的鍵用來存放屬性值,普通集合類型比如簡單對象會阻止垃圾回收器對這些作為屬性鍵存在的對象的回收,有造成內存泄漏的危險。而WeakMap,WeakSet則更加安全些,這些作為屬性鍵的對象如果沒有別的變量在引用它們,則會被回收釋放掉,具體還看下面的例子:// Weak Mapsvar wm = new WeakMap();wm.set(s, {extra: 42});wm.size === undefined // 對象釋放了// Weak Setsvar ws = new WeakSet();ws.add({data: 42}); // 因為添加到ws的這個臨時對象沒有其他變量引用它,所以ws不會保存它的值,也就是說這次添加其實沒有意思 ProxiesProxy可以監聽對象身上發生了什么事情,并在這些事情發生后執行一些相應的操作。一下子讓我們對一個對象有了很強的追蹤能力,同時在數據綁定方面也很有用處。// 定義被偵聽的目標對象var engineer = {name: 'Joe Sixpack', salary: 50};// 定義處理程序var interceptor = {set: function(receiver, property, value) {console.log(property, 'is changed to', value);receiver[property] = value;}};// 創建代理以進行偵聽engineer = Proxy(engineer, interceptor);//做一些改動來觸發代理engineer.salary = 60; // 控制臺輸出:salary is changed to 60 

上面代碼我已加了注釋,這里進一步解釋。對于處理程序,是在被偵聽的對象身上發生了相應事件之后,處理程序里面的方法就會被調用,上面例子中我們設置了set的處理函數,表明,如果我們偵聽的對象的屬性被更改,也就是被set了,那這個處理程序就會被調用,同時通過參數能夠得知是哪個屬性被更改,更改為了什么值。

Symbols

我們知道對象其實是鍵值對的集合,而鍵通常來說是字符串。而現在除了字符串外,我們還可以用symbol這種值來做為對象的鍵。Symbol是一種 基本類型,像數字,字符串還有布爾一樣,它不是一個對象。Symbol 通過調用symbol函數產生,它接收一個可選的名字參數,該函數返回的symbol是唯一的。之后就可以用這個返回值做為對象的鍵了。Symbol還可以用來創建私有屬性,外部無法直接訪問由symbol做為鍵的屬性值。

(function() {// 創建 symbolvar key = Symbol("key");function MyClass(privateData) {this[key] = privateData;}MyClass.prototype = {doStuff: function() {...this[key]...}};})();var c = new MyClass("hello");c["key"] === undefined //無法訪問該屬性,因為是私有的 Math,Number,String,Object 的新API對Math,Number,String還有Object等添加了許多新的API。// Number// 不同的兩個Number之間的最小的差Number.EPSILON// 判斷是否是整數Number.isInteger(Infinity) // false// 判斷是否為非數字Number.isNaN("NaN") // false// MathMath.acosh(3) // 1.762747174039086Math.hypot(3,4) // 5Math.imul(Math.pow(2,32)-1, Math.pow(2,32)-2) // 2// String"abcde".contains("cd") // true"abc".repeat(3) // "abcabcabc"http:// Array// 將一個類數組對象或可迭代對象轉換成真實的數組Array.from(document.querySelectorAll('*'))// 將它的任意類型的多個參數放在一個數組里并返回Array.of(1,2,3)// 將一個數組中指定區間的所有元素的值, 都替換成或者說填充成為某個固定的值[0,0,0].fill(7,1) // [0,7,7]// 用來查找數組中某指定元素的索引, 如果找不到指定的元素, 則返回 -1[1,2,3].findIndex(x => x == 2) // 1// 返回一個 Array Iterator 對象,該對象包含數組中每一個索引的鍵值對["a","b","c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]// 返回一個數組索引的迭代器["a","b","c"].keys() // iterator 0, 1, 2// 返回一個新的 Array Iterator 對象,該對象包含數組每個索引的值["a","b","c"].values() // iterator "a", "b", "c"http:// ObjectObject.assign(Point, {origin: new Point(0,0)}) PromisesPromises是處理異步操作的一種模式,之前在很多三方庫中有實現,比如jQuery的deferred 對象。當你發起一個異步請求,并綁定了.when(), .done()等事件處理程序時,其實就是在應用promise模式。// 創建 promisevar promise = new Promise(function(resolve,reject) {// 進行一些異步或耗時操作if(/*如果成功 */) {resolve("Stuff worked!");} else {reject(Error("It broke"));}});// 綁定處理程序promise.then(function(result) {// promise成功的話會執行這里console.log(result); // "Stuff worked!"}, function(err) {// promise失敗會執行這里console.log(err); // Error: "It broke"});

有關ES6的新特性就給大家介紹這么多,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凌海市| 株洲市| 堆龙德庆县| 岳西县| 普定县| 东乌| 青海省| 龙山县| 阳朔县| 梓潼县| 正定县| 巴彦淖尔市| 新龙县| 资阳市| 石家庄市| 玛曲县| 吉安市| 准格尔旗| 甘泉县| 调兵山市| 林甸县| 永康市| 剑川县| 垣曲县| 灯塔市| 松原市| 曲周县| 涿鹿县| 墨江| 定日县| 衡阳县| 建湖县| 南乐县| 包头市| 兴宁市| 西畴县| 吉水县| 高唐县| 兴宁市| 甘谷县| 隆德县|