亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

跟我學習javascript的最新標準ES6

2024-05-06 16:25:09
字體:
來源:轉載
供稿:網友

跟我學習javascript的最新標準ECMAScript 6,ES6(ECMAScript 6)是即將到來的新版本JavaScript語言的標準,代號harmony,感興趣的小伙伴們可以參考一下

雖然ES6都還沒真正發布,但已經有用ES6重寫的程序了,各種關于ES789的提議已經開始了,這你敢信。潮流不是我等大眾所能追趕的。

潮流雖然太快,但我們不停下學習的步伐,就不會被潮流丟下的,下面來領略下ES6中新特性,一堵新生代JS的風采。

箭頭操作符

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

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

 

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

大家可以打開文章開頭提到的traceur在線代碼轉譯頁面輸入代碼來查看效果。

類的支持

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

下面代碼展示了類在ES6中的使用。再次啰嗦一句,你可以將代碼貼到traceur自己查看運行結果。

 

 
  1. //類的定義 
  2. class Animal { 
  3. //ES6中新型構造器 
  4. constructor(name) { 
  5. this.name = name; 
  6. //實例方法 
  7. sayName() { 
  8. console.log('My name is '+this.name); 
  9. //類的繼承 
  10. class Programmer extends Animal { 
  11. constructor(name) { 
  12. //直接調用父類構造器進行初始化 
  13. super(name); 
  14. program() { 
  15. console.log("I'm coding..."); 
  16. //測試我們的類 
  17. var animal=new Animal('dummy'), 
  18. wayou=new Programmer('wayou'); 
  19. animal.sayName();//輸出 ‘My name is dummy' 
  20. wayou.sayName();//輸出 ‘My name is wayou' 
  21. wayou.program();//輸出 ‘I'm coding...' 

增強的對象字面量

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

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

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

直接調用父類方法

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

 

 
  1. //通過對象字面量創建對象 
  2. var human = { 
  3. breathe() { 
  4. console.log('breathing...'); 
  5. }; 
  6. var worker = { 
  7. __proto__: human, //設置此對象的原型為human,相當于繼承human 
  8. company: 'freelancer'
  9. work() { 
  10. console.log('working...'); 
  11. }; 
  12. human.breathe();//輸出 ‘breathing...' 
  13. //調用繼承來的breathe方法 
  14. worker.breathe();//輸出 ‘breathing...' 

字符串模板

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

 

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

解構

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

 

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

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

1、默認參數值

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

 

  1. function sayHello(name){ 
  2. //傳統的指定默認參數的方式 
  3. var name=name||'dude'
  4. console.log('Hello '+name); 
  5. //運用ES6的默認參數 
  6. function sayHello2(name='dude'){ 
  7. console.log(`Hello ${name}`); 
  8. sayHello();//輸出:Hello dude 
  9. sayHello('Wayou');//輸出:Hello Wayou 
  10. sayHello2();//輸出:Hello dude 
  11. sayHello2('Wayou');//輸出:Hello Wayou 

2、不定參數

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

 

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

3、拓展參數

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

 

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

let與const 關鍵字

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

 

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

for of 值遍歷

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

 

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

注意,此功能google traceur并未實現,所以無法模擬調試,下面有些功能也是如此

iterator, generator

這一部分的內容有點生澀,詳情可以參見這里。以下是些基本概念。

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

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

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

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

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

模塊

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

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

 

 
  1. // point.js 
  2. module "point" { 
  3. export class Point { 
  4. constructor (x, y) { 
  5. public x = x; 
  6. public y = y; 
  7.  
  8. // myapp.js 
  9. //聲明引用的模塊 
  10. module point from "/point.js"
  11. //這里可以看出,盡管聲明了引用的模塊,還是可以通過指定需要的部分進行導入 
  12. import Point from "point"
  13.  
  14. var origin = new Point(0, 0); 
  15. console.log(origin); 

Map,Set 和 WeakMap,WeakSet

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

下方代碼來自es6feature

 

 
  1. // Sets 
  2. var s = new Set(); 
  3. s.add("hello").add("goodbye").add("hello"); 
  4. s.size === 2; 
  5. s.has("hello") === true
  6.  
  7. // Maps 
  8. var m = new Map(); 
  9. m.set("hello", 42); 
  10. m.set(s, 34); 
  11. m.get(s) == 34; 

有時候我們會把對象作為一個對象的鍵用來存放屬性值,普通集合類型比如簡單對象會阻止垃圾回收器對這些作為屬性鍵存在的對象的回收,有造成內存泄漏的危險。而WeakMap,WeakSet則更加安全些,這些作為屬性鍵的對象如果沒有別的變量在引用它們,則會被回收釋放掉,具體還看下面的例子。

正文代碼來自es6feature

 

 
  1. // Weak Maps 
  2. var wm = new WeakMap(); 
  3. wm.set(s, { extra: 42 }); 
  4. wm.size === undefined 
  5.  
  6. // Weak Sets 
  7. var ws = new WeakSet(); 
  8. ws.add({ data: 42 });//因為添加到ws的這個臨時對象沒有其他變量引用它,所以ws不會保存它的值,也就是說這次添加其實沒有意思 

Proxies

Proxy可以監聽對象身上發生了什么事情,并在這些事情發生后執行一些相應的操作。一下子讓我們對一個對象有了很強的追蹤能力,同時在數據綁定方面也很有用處。

以下例子借用自這里。

 

  1. //定義被偵聽的目標對象 
  2. var engineer = { name: 'Joe Sixpack', salary: 50 }; 
  3. //定義處理程序 
  4. var interceptor = { 
  5. set: function (receiver, property, value) { 
  6. console.log(property, 'is changed to', value); 
  7. receiver[property] = value; 
  8. }; 
  9. //創建代理以進行偵聽 
  10. engineer = Proxy(engineer, interceptor); 
  11. //做一些改動來觸發代理 
  12. engineer.salary = 60;//控制臺輸出:salary is changed to 60 

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

Symbols

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

以下例子來自es6features

 

 
  1. (function() { 
  2.  
  3. // 創建symbol 
  4. var key = Symbol("key"); 
  5.  
  6. function MyClass(privateData) { 
  7. this[key] = privateData; 
  8.  
  9. MyClass.prototype = { 
  10. doStuff: function() { 
  11. ... this[key] ... 
  12. }; 
  13.  
  14. })(); 
  15.  
  16. var c = new MyClass("hello"
  17. c["key"] === undefined//無法訪問該屬性,因為是私有的 

Math,Number,String,Object 的新API

對Math,Number,String還有Object等添加了許多新的API。下面代碼同樣來自es6features,對這些新API進行了簡單展示。

 

 
  1. Number.EPSILON 
  2. Number.isInteger(Infinity) // false 
  3. Number.isNaN("NaN"// false 
  4.  
  5. Math.acosh(3) // 1.762747174039086 
  6. Math.hypot(3, 4) // 5 
  7. Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2 
  8.  
  9. "abcde".contains("cd"// true 
  10. "abc".repeat(3) // "abcabcabc" 
  11.  
  12. Array.from(document.querySelectorAll('*')) // Returns a real Array 
  13. Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior 
  14. [0, 0, 0].fill(7, 1) // [0,7,7] 
  15. [1,2,3].findIndex(x => x == 2) // 1 
  16. ["a""b""c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"] 
  17. ["a""b""c"].keys() // iterator 0, 1, 2 
  18. ["a""b""c"].values() // iterator "a", "b", "c" 
  19.  
  20. Object.assign(Point, { origin: new Point(0,0) }) 

Promises

Promises是處理異步操作的一種模式,之前在很多三方庫中有實現,比如jQuery的deferred 對象。當你發起一個異步請求,并綁定了.when(), .done()等事件處理程序時,其實就是在應用promise模式。

 

 
  1. //創建promise 
  2. var promise = new Promise(function(resolve, reject) { 
  3. // 進行一些異步或耗時操作 
  4. if ( /*如果成功 */ ) { 
  5. resolve("Stuff worked!"); 
  6. else { 
  7. reject(Error("It broke")); 
  8. }); 
  9. //綁定處理程序 
  10. promise.then(function(result) { 
  11. //promise成功的話會執行這里 
  12. console.log(result); // "Stuff worked!" 
  13. }, function(err) { 
  14. //promise失敗會執行這里 
  15. console.log(err); // Error: "It broke" 
  16. }); 

總結就是一句話,前后端差異越來越小了,本文基于lukehoban/es6features ,同時參考了大量博客資料,小編做這么多功課的目的就是幫助大家更好地了解javascript的最新標準ECMAScript 6,希望對大家的學習有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高清日韩电视剧大全免费播放在线观看| 国产欧美最新羞羞视频在线观看| 欧美一区二区三区艳史| 欧美精品生活片| xxxx性欧美| 亚洲精品乱码久久久久久按摩观| 91免费视频国产| 国产精品露脸av在线| 亚洲精品wwwww| 欧美亚洲国产成人精品| 57pao国产精品一区| 一区国产精品视频| 亚洲人永久免费| 亚洲第一视频网| 久久精品亚洲一区| 国产精品xxxxx| 国产精品欧美日韩一区二区| 国产主播精品在线| **欧美日韩vr在线| 国产成人精品免费视频| 久久久久久久国产精品| 亚洲国产福利在线| 国产精品观看在线亚洲人成网| 国产精品久久在线观看| 97久久国产精品| 中文字幕免费精品一区高清| 亚洲欧美国产精品专区久久| 久久影视免费观看| 欧美限制级电影在线观看| 久久久精品久久久久| 国产精品久久激情| 日韩中文字幕精品| 国产精品老女人视频| 77777亚洲午夜久久多人| 亚洲91精品在线| 国产精品高清网站| 97在线视频精品| 日韩精品久久久久久福利| 精品欧美国产一区二区三区| 国产成人拍精品视频午夜网站| 国产亚洲一区二区在线| 日韩av黄色在线观看| 欧美性生交xxxxx久久久| 亚洲一区二区三区在线免费观看| 国产精品国产三级国产aⅴ浪潮| 欧美日韩电影在线观看| 中文字幕在线日韩| 色综合久久久888| 国产精品黄色影片导航在线观看| 久久久久久久久久久久av| 中文字幕久久亚洲| 亚洲欧美另类自拍| 亚洲最大的av网站| 狠狠躁夜夜躁人人爽天天天天97| 国产亚洲人成网站在线观看| 亚洲天天在线日亚洲洲精| 亚洲欧美日韩精品久久亚洲区| 91丨九色丨国产在线| 国产成人一区二区三区电影| 国产在线播放91| 国内免费久久久久久久久久久| 午夜免费在线观看精品视频| 一本一本久久a久久精品牛牛影视| 亚洲一品av免费观看| 国内揄拍国内精品| 日韩美女在线观看| 一区二区三区动漫| 欧美激情视频网址| 亚洲精品一区二区在线| 日韩中文字幕欧美| 日日骚久久av| 日韩欧美在线视频观看| 久久久精品电影| 在线亚洲男人天堂| 永久免费看mv网站入口亚洲| 欧美www视频在线观看| 欧美日韩国产第一页| 精品中文字幕视频| 欧美猛男性生活免费| 国产成人福利视频| 欧美精品亚州精品| 伦理中文字幕亚洲| 国产精品亚洲激情| 91热福利电影| 国产精品专区h在线观看| 亚洲系列中文字幕| 狠狠色狠狠色综合日日五| 日韩精品在线私人| 91精品久久久久久久久| 亚洲人a成www在线影院| 3344国产精品免费看| 日韩欧美国产高清91| 欧美日韩国产成人在线观看| 欧美日韩人人澡狠狠躁视频| 欧美国产日韩中文字幕在线| 亚洲人午夜精品| 欧美精品九九久久| 亚洲电影免费观看| 久青草国产97香蕉在线视频| 亚洲日韩欧美视频| 国产欧美在线视频| 亚洲自拍高清视频网站| 成人a视频在线观看| 日韩视频精品在线| 国产美女久久精品香蕉69| 日韩在线观看高清| 九九热这里只有精品6| 亚洲精品不卡在线| 国自产精品手机在线观看视频| 欧美激情视频网站| 亚洲国产精品久久久久| 久久久久久91| 色综合久久久888| 国产成人亚洲综合青青| 久久久精品2019中文字幕神马| 亚洲人成自拍网站| 国产视频亚洲视频| 国产精品爱啪在线线免费观看| 亚洲国产成人一区| 欧美高清在线视频观看不卡| 国产极品jizzhd欧美| 国产亚洲精品美女久久久| 国产精品久久久久久久久免费| 午夜剧场成人观在线视频免费观看| 国产亚洲精品久久久久久牛牛| 久久人人爽人人爽人人片亚洲| 欧美性xxxx极品hd满灌| 日韩欧美极品在线观看| 亚洲欧美国产视频| 久久av红桃一区二区小说| 亚洲成年人影院在线| 国内精品久久久久久| 日韩hd视频在线观看| 精品一区二区三区四区在线| 亚洲国产精品va在看黑人| 一本大道香蕉久在线播放29| 成人精品在线观看| 国外成人在线视频| 日韩精品福利网站| 久久国产精品网站| 国产精品亚洲激情| 不卡av在线播放| 久久精视频免费在线久久完整在线看| 亚洲第一页中文字幕| 久久69精品久久久久久国产越南| 久久久久久国产精品三级玉女聊斋| 亚洲天堂av在线免费观看| 久久韩国免费视频| 亚洲精品97久久| 久久久久久久亚洲精品| 亚洲综合色av| 国产精品网址在线| 正在播放欧美视频| 欧美精品在线视频观看| 亚洲欧美在线一区二区| 欧美国产亚洲精品久久久8v| 欧美激情中文字幕乱码免费| 精品国产乱码久久久久久虫虫漫画| 欧美大学生性色视频| 色综合天天综合网国产成人网| 欧美亚洲国产另类| 中文字幕精品久久| 久久久精品国产一区二区| 国产成人精品免高潮在线观看|