摘要:和命令和類似于中的的使用都是用來聲明變量的,只是都存在各自的特殊用法。解構數組和對象是中最常用也是最重要表示形式。實例生成以后,可以用方法分別指定狀態和狀態的回調函數。這個迭代器對象擁有一個叫做的方法來幫助你重啟函數并得到下一個值。
let和const命令
let和const類似于javascript中的var的使用,都是用來聲明變量的,只是都存在各自的特殊用法。
在javascript中只有全局作用域和函數作用域,例如:
var name = "one";//全局變量 while(true){ name = "two"; console.log(name);//two,內層變量覆蓋了外層變量 break; } console.log(name);//two,
不出意料,兩次輸出結果都是two。
而ES6帶來的一個新特性:
let:為javascript添加一個塊級作用域
使用let聲明的變量,只作用于使用了let命令的代碼塊:
var name = "one";//全局變量 while(true){ let name = "two"; console.log(name);//two, break; } console.log(name);//one
const :聲明一個只讀的常量。一旦聲明,常量的值就不能改變
const PI = Math.PI; console.log(PI); //3.141592653589793 PI = 666; //報錯Module build failed: SyntaxError: "PI" is read-only模板字符串
es6模板字符簡直是開發者的福音,解決了ES5在字符串功能上的痛點。
基本的字符串格式化,將表達式嵌入字符串中進行拼接。用${}來界定。例如:
//es5 var name = "Archer" console.log("hello" + name) //es6 const name = "Archer" console.log(`hello ${name}`) //hello Archer
在ES5時我們通過反斜杠()來做多行字符串或者字符串一行行拼接。ES6反引號(``)直接搞定。
// es5 var msg = "Hi Archer! " // es6 const template = `hello Archer`
對于字符串es6當然也提供了很多厲害的方法,列舉幾個常用的:
// includes:判斷是否包含然后直接返回布爾值 let str = "hahay" console.log(str.includes("y")) // true // repeat: 獲取字符串重復n次 let s = "ha" console.log(s.repeat(3)) // "hahaha"箭頭函數
ES6很有意思的一部分就是函數的快捷寫法,也就是箭頭函數,箭頭函數最直觀的三個特點:
不需要function關鍵字來創建函數
省略return關鍵字
繼承當前上下文的 this 關鍵字
let arr = [1,2,3]; arr.map(item => item + 1) //等同于 arr.map(function(item){ return item + 1 })
當函數有且僅有一個參數的時候,是可以省略掉(),當函數返回有且僅有一個表達式的時候可以省略{};例如:
//參數name就沒有括號 var people = name => "hello" + name函數的默認值
ES6 之前,不能直接為函數的參數指定默認值,只能采用變通的方法。例如:
function log(x, y) { y = y || "Archer"; console.log(x, y); } log("Hello") // Hello Archer log("Hello", "China") // Hello China log("Hello", "") // Hello Archer
上面代碼檢查函數log的參數y有沒有賦值,如果沒有,則指定默認值為Archer。這種寫法的缺點在于,如果參數y賦值了,但是對應的布爾值為false,則該賦值不起作用。就像上面代碼的最后一行,參數y等于空字符,結果被改為默認值。
現在 ES6 允許為函數的參數設置默認值,即直接寫在參數定義的后面,為賦值提供了簡便的方法。例如:
function log(x, y = "Archer") { console.log(x, y); } log("Hello") // Hello Archer log("Hello", "China") // Hello China log("Hello", "") // Hello
可以看到,ES6 的寫法比 ES5 簡潔許多,而且非常自然。下面是另一個例子。
function Point(x = 0, y = 0) { this.x = x; this.y = y; } const p = new Point(); p // { x: 0, y: 0 }展開運算符
...展開運算符,有兩種層面
展開運算符(spread operator)作用是和字面意思一樣,就是把東西展開??梢杂迷赼rray和object上都行。例如:
let a = [1,2,3]; let b = [0, ...a, 4]; // [0,1,2,3,4] let obj = { a: 1, b: 2 }; let obj2 = { ...obj, c: 3 }; // { a:1, b:2, c:3 } let obj3 = { ...obj, a: 3 }; // { a:3, b:2 }
剩余操作符(rest operator)是解構的一種,意思就是把剩余的東西放到一個array里面賦值給它。一般只針對array的解構。例如:
let a = [1,2,3]; let [b, ...c] = a; b; // 1 c; // [2,3] // 也可以 let a = [1,2,3]; let [b, ...[c,d,e]] = a; b; // 1 c; // 2 d; // 3 e; // undefined // 也可以 function test(a, ...rest){ console.log(a); // 1 console.log(rest); // [2,3] } test(1,2,3)對象的擴展
對象初始化簡寫
ES5我們對于對象都是以鍵值對的形式書寫,是有可能出現鍵值對重名的。例如:
function people(name, age) { return { name: name, age: age }; }
鍵值對重名,ES6可以簡寫如下:
function people(name, age) { return { name, age }; }
ES6 同樣改進了為對象字面量方法賦值的語法。ES5為對象添加方法:
const people = { name: "lux", getName: function() { console.log(this.name) } }
ES6通過省略冒號與 function 關鍵字,將這個語法變得更簡潔:
const people = { name: "lux", getName () { console.log(this.name) } }
ES6 對象提供了Object.assign()這個方法來實現淺復制。Object.assign()可以把任意多個源對象自身可枚舉的屬性拷貝給目標對象,然后返回目標對象。第一參數即為目標對象。在實際項目中,我們為了不改變源對象。一般會把目標對象傳為{}。
const obj = Object.assign({}, objA, objB)解構
數組和對象是JS中最常用也是最重要表示形式。為了簡化提取信息,ES6新增了解構,這是將一個數據結構分解為更小的部分的過程。
ES5我們提取對象中的信息形式如下:
const people = { name: "Archer", age: 28 } const name = people.name const age = people.age console.log(name + " --- " + age) //"Archer --- 28"
在ES6之前我們就是這樣獲取對象信息的,一個一個獲取?,F在,解構能讓我們從對象或者數組里取出數據存為變量。例如:
//對象 const people = { name: "Archer", age: 28 } const { name, age } = people console.log(`${name} --- ${age}`) //數組 const color = ["red", "blue"] const [first, second] = color console.log(first) //"red" console.log(second) //"blue"import 和 export
import導入模塊、export導出模塊
//全部導入 import people from "./example" //有一種特殊情況,即允許你將整個模塊當作單一對象進行導入 //該模塊的所有導出都會作為對象的屬性存在 import * as example from "./example.js" console.log(example.name) console.log(example.age) console.log(example.getName()) //導入部分 import {name, age} from "./example" // 導出默認, 有且只有一個默認 export default App // 部分導出 export class App extend Component {};
導入的時候有沒有大括號的區別是什么。下面是我在工作中的總結:
當用export default people導出時,就用 import people 導入(不帶大括號)
一個文件里,有且只能有一個export default。但可以有多個export。
當用export name 時,就用import { name }導入(記得帶上大括號)
當一個文件里,既有一個export default people, 又有多個export name 或者 export
age時,導入就用 import people, { name, age }
當一個文件里出現n多個 export 導出很多模塊,導入時除了一個一個導入,也可以用import * as example
Promise在promise之前代碼過多的回調或者嵌套,可讀性差、耦合度高、擴展性低。通過Promise機制,扁平化的代碼機構,大大提高了代碼可讀性;用同步編程的方式來編寫異步代碼,保存線性的代碼邏輯,極大的降低了代碼耦合性而提高了程序的可擴展性。
Promise對象有以下兩個特點:
對象的狀態不受外界影響。Promise對象代表一個異步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失?。?。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:從pending變為fulfilled和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為
resolved(已定型)。如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
說白了就是用同步的方式去寫異步代碼,下面代碼創造了一個Promise實例:
const promise = new Promise(function(resolve, reject) { if (/* 異步操作成功 */){ resolve(value); } else { reject(error); } });
Promise構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署。
resolve函數的作用是,將Promise對象的狀態從“未完成”變為“成功”(即從 pending 變為 resolved),在異步操作成功時調用,并將異步操作的結果,作為參數傳遞出去;reject函數的作用是,將Promise對象的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在異步操作失敗時調用,并將異步操作報出的錯誤,作為參數傳遞出去。
Promise實例生成以后,可以用then方法分別指定resolved狀態和rejected狀態的回調函數。
promise.then(function(value) { // success }, function(error) { // failure });
下面是一個Promise對象的簡單例子,timeout方法返回一個Promise實例,表示一段時間以后才會發生的結果。過了指定的時間(ms參數)以后,Promise實例的狀態變為resolved,就會觸發then方法綁定的回調函數。:
function timeout(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms, "done"); }); } timeout(100).then((value) => { console.log(value); });Generators
生成器( generator)是能返回一個迭代器的函數。生成器函數也是一種函數,最直觀的表現就是比普通的function多了個星號*,在其函數體內可以使用yield關鍵字,有意思的是函數會在每個yield后暫停。
這里生活中有一個比較形象的例子。咱們到銀行辦理業務時候都得向大廳的機器取一張排隊號。你拿到你的排隊號,機器并不會自動為你再出下一張票。也就是說取票機“暫?!弊×?,直到下一個人再次喚起才會繼續吐票。
說說迭代器。當你調用一個generator時,它將返回一個迭代器對象。這個迭代器對象擁有一個叫做next的方法來幫助你重啟generator函數并得到下一個值。next方法不僅返回值,它返回的對象具有兩個屬性:done和value。value是你獲得的值,done用來表明你的generator是否已經停止提供值。繼續用剛剛取票的例子,每張排隊號就是這里的value,打印票的紙是否用完就這是這里的done。
// 生成器 function *createIterator() { yield 1; yield 2; yield 3; } // 生成器能像正規函數那樣被調用,但會返回一個迭代器 let iterator = createIterator(); console.log(iterator.next().value); // 1 console.log(iterator.next().value); // 2 console.log(iterator.next().value); // 3
那生成器和迭代器又有什么用處呢?
圍繞著生成器的許多興奮點都與異步編程直接相關。異步調用對于我們來說是很困難的事,我們的函數并不會等待異步調用完再執行,你可能會想到用回調函數,(當然還有其他方案比如Promise比如Async/await)。
生成器可以讓我們的代碼進行等待。就不用嵌套的回調函數。使用generator可以確保當異步調用在我們的generator函數運行一下行代碼之前完成時暫停函數的執行。
那么問題來了,咱們也不能手動一直調用next()方法,你需要一個能夠調用生成器并啟動迭代器的方法。就像這樣子的:
function run(taskDef) { //taskDef即一個生成器函數 // 創建迭代器,讓它在別處可用 let task = taskDef(); // 啟動任務 let result = task.next(); // 遞歸使用函數來保持對 next() 的調用 function step() { // 如果還有更多要做的 if (!result.done) { result = task.next(); step(); } } // 開始處理過程 step(); }
生成器與迭代器最有趣、最令人激動的方面,或許就是可創建外觀清晰的異步操作代碼。你不必到處使用回調函數,而是可以建立貌似同步的代碼,但實際上卻使用 yield 來等待異步操作結束。
總結ES6的特性遠不止于此,但對于我們日常的開發開說,這已經是夠夠的了,還有很多有意思的方法。比如for of,Iterator...等等。
來都來了點一下贊吧,你的贊是對我最大的鼓勵^_^
希望更全面了解es6伙伴們可以去看阮一峰所著的電子書ECMAScript 6入門
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94914.html
摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:本系列文章適合快速掌握入門語法,想深入學習的小伙伴可以看看阮一峰老師的入門本篇文章是對之前文章的一個補充,可以使代碼更簡潔函數參數默認值在傳統語法中如果想設置函數默認值一般我們采用判斷的形式在新的語法中我們可以在參數聲明的同時賦予默認值參數 本系列文章適合快速掌握 ES6 入門語法,想深入學習 ES6 的小伙伴可以看看阮一峰老師的《ECMAScript 6 入門》 本篇文章是對之前文章...
摘要:結合工作中使用情況,簡單對進行一些復習總結,包括常用的語法,等,以及短時間內要上手需要重點學習的知識點不同工作環境可能有一些差別,主要參考鏈接是阮一峰的博客以及外文博客阮老師大部分文章是直接翻譯的這個博客簡介先說一下,是一個標準化組織,他們 結合工作中使用情況,簡單對es6進行一些復習總結,包括常用的語法,api等,以及短時間內要上手需要重點學習的知識點(不同工作環境可能有一些差別),...
摘要:在重寫完了的時候,就個人總結了一下常用的一些常用的語法和比優越的方面。參數字符串是否在原字符串的尾部返回布爾值。第一個大于的成員的索引方法,用于某個數組是否包含給定的值,返回一個布爾值。 1.前言 前幾天,用es6的語法重寫了我的一個代碼庫,說是重寫,其實改動的并不多,工作量不大。在重寫完了的時候,就個人總結了一下es6常用的一些常用的語法和比es5優越的方面。下面提到的語法可能也就是...
閱讀 2211·2019-08-30 15:54
閱讀 1947·2019-08-30 13:49
閱讀 665·2019-08-29 18:44
閱讀 824·2019-08-29 18:39
閱讀 1104·2019-08-29 15:40
閱讀 1524·2019-08-29 12:56
閱讀 3134·2019-08-26 11:39
閱讀 3094·2019-08-26 11:37