1. 程式人生 > 實用技巧 >v-text的作用—設定標籤的文字值

v-text的作用—設定標籤的文字值

技術標籤:javascript

let關鍵字

用來定義塊作用域變數的
	var定義函式級作用域變數
		在函式內部定義的變數,外部無法訪問
		在程式碼塊(if, for等)中定義的變數,外部可以訪問
	let定義塊作用域變數的:
		在函式內部定義的變數,外部無法訪問,
		在程式碼塊(if, for等)中定義的變數,外部仍然無法訪問

let與var比較

作用域				  var函式級作用域			    let塊級作用域
重複定義			 var可以重複定義變數		  let不可以重複定義變數
宣告前置			 var支援宣告前置			   let不支援宣告前置
for迴圈中儲存資料	   var不能儲存資料			 let可以儲存資料
被window掛載	      var可以被掛載				let不能被掛載

const關鍵字

const關鍵字是用來定義常量(一旦定義無法改變的變數,通常是表示一些固定不變的資料)
	使用const關鍵字的特點:
		1 無法被修改
		2 支援塊作用域(只能在程式碼塊裡面訪問)
		3 無法重複定義
		4 無法宣告前置
		5 不能被window掛載
		6 不能作為for迴圈體中的變數使用
		7 值只能是值型別,如果是引用型別則可以被修改
	通常是用大寫字母表示,並且橫線分割單詞,常用於定義配置量

字串擴充套件–多行字串

單行字串:由一組單引號或者雙引號定義的字串
	單行字串的問題:1 單行字串不能換行。2 一些特殊的案件要使用轉義字元\n。3 一些特殊的字元要使用轉義符\x20 4 字串標誌符號不能直接巢狀,單引號中不能直接寫單引號,要轉義\',雙引號中不能直接寫雙引號,要轉義\"

ES6為了解決單行字串中的問題,提供了多行字串
	通過 ` 定義,在多行字串中,只有`需要轉義\`,其它的字元,都可以直接書寫
	並且ES6多行字串支援插值語法:${key}
	${}提供了js環境,因此我們可以寫js表示式
	ES6的插值語法,讓其它框架的插值語法的重要性,大打折扣

字串擴充套件–原始字串

在使用了轉義字元之後,並且在瀏覽器檢視的時候,我們只能看到結果,不能看到原始完整的字串(包含轉義符),於是ES6中擴充套件了String.raw方法用於,檢視完整的原始字串
	使用方式
		String.raw``
	引數通過多行字串的形式傳遞,字串中的轉義字元不會被轉義

字串擴充套件–重複字串

ES6中拓展了repeat方法用於重複輸出字串
	引數就是要重複的次數
	返回值就是重複的結果	
對原始字串沒有影響
	
let str = 'hello ||';
console.log(str.repeat(3));

字串拓展–判斷字串的位置

startsWith(str, pos)	是否以引數字串開頭
	擷取後面的部分,並且包含擷取位置字元
	str	引數字串(子字串)
	pos 字串擷取位置
	返回值都是布林值

endsWith(str, pos)		是否以引數字串結尾
	擷取前面的部分,並且不包含擷取位置字元

includes(str, pos)		是否包含引數字串
	擷取後面的部分,並且包含擷取位置字元
	


let str = '判斷字串的位置';
// 是否以引數字串開頭,擷取後面的部分,並且包含擷取位置字元
console.log(str.startsWith('判斷', 0));
// 是否以引數字串結尾,擷取前面的部分,並且不包含擷取位置字元
console.log(str.endsWith('位置', 8));
// 是否包含引數字串,擷取後面的部分,並且包含擷取位置字元     
console.log(str.includes('位置', 0));

數字拓展–isNaN

ES6為數字擴充套件了幾個方法:isNaN, isFinite, isInteger
全域性中有一個isNaN方法,是用於判斷是否是NaN(not a Number)
	全域性中isNaN在判斷的時候,會進行型別轉換
	而Number拓展的isNaN,在判斷的時候不會做型別轉換
		首先必須是數字
		其次才去判斷是否是NaN
			如果是NaN,則返回true
			如果不是NaN,則返回false

全域性中有一個isFinite方法,是用於判斷是否是有限的
	全域性中isFinite在判斷的時候,會進行型別轉換
	而Number拓展的isFinite,在判斷的時候不會做型別轉換
		首先必須是數字
		其次才去判斷是否是有限的
			如果是有限的,則返回true
			如果不是有限的,則返回false

Number拓展的isInteger方法,用於判斷是否是整型的
	在判斷的過程中,會校驗型別
		首先必須是數字
		其次才去判斷是否是整型的
			如果是整型,則返回true
			如果不是整型,則返回false

數學物件拓展

就是對Math物件的拓展
ES6為了適應大型專案,解決自身運算的問題,拓展了大量的方法
	Math.cbrt:計算一個數的立方根
	Math.fround:返回一個數的單精度浮點數形式
	Math.hypot:返回所有引數的平方和的平方根
	Math.expm1(x):返回ex-1
	Math.log1p(x):返回1 + x 的自然對數。如果x小於-1,返回NaN
	Math.log10(x):返回以10為底的x的對數,如果x小於0,則返回NaN
	Math.log2(x):返回以2為底的x的對數,如果x小於0,則返回NaN

物件拓展–物件字面量

物件字面量:let obj = {}
省略語法:
	1 如果定義的屬性名稱與屬性值變數同名,我們可以省略屬性名稱以及冒號
	2 可以對屬性名稱書寫表示式,通過[]動態的設定屬性名稱
		之前可以通過[]來獲取屬性,現在我們可以通過[]來設定屬性名
	3 在物件中定義方法可以省略冒號以及function


let color = 'red';
let obj = {
    // color: color
    // 1 如果定義的屬性名稱與屬性值變數同名,我們可以省略屬性名稱以及冒號
    color,
    // 2 可以對屬性名稱書寫表示式,通過[]動態的設定屬性名稱
    [color]: 200,
    // []提供了js環境,可以書寫複雜的表示式
    [color.toUpperCase() + '_hello']: 200,
    // 定義方法
    // getColor: function() {
    //     return this.color;
    // }
    // 3 ES6在物件中定義方法可以省略冒號以及function
    getColor() {
    	return this.color;
    }
}

物件擴充套件–is

is方法用於判斷兩個引數是否全等(===)
全等判斷有幾個問題:
	1、0 -0之前在進行全等判斷的時候,得到的是true
		0和-0之間是差了一個符號位,在二進位制中,儲存的資料是不同的
	2、NaN和NaN在進行全等判斷的時候,得到的是false
		所有NaN都表示“不是一個數字”,他們儲存的地址是一樣
物件拓展的is方法:
	在判斷0和-0的時候,得到false
	在判斷NaN的時候,得到的是true
除此之外,is方法和全等符號是一致的


console.log(Object.is(0 / 1, 0 / -1));      // false
console.log(Object.is(NaN, +'abc'));        // true
// 除此之外,is方法和全等符號(===)是一致的

物件拓展–assign

ES6拓展的assign是用於複製物件的
	使用方式:Object.assign(obj, obj1, obj2)
		obj:被複制的目標物件	從第二個引數開始,都是複製的物件	返回值是目標物件obj
	注意:後面物件中的同名屬性會覆蓋前面物件中的屬性
assign方法實現的是一個淺複製
	淺複製:值型別是直接複製,而引用型別是改變指向,沒有真正的複製
	深複製:值型別是直接複製,引用型別也是直接複製,並不是改變指向(函式除外)
		簡單實現深複製:JSON.parse(JSON.stringify),但是轉換json字串的時候,會過濾掉函式

陣列拓展–from

from方法是用於遍歷類陣列物件,或將類陣列物件轉換成陣列,是陣列的靜態方法
	類陣列物件:可以通過索引值獲取屬性值,並且要具備length屬性的一類物件
類陣列物件不能使用陣列的遍歷器方法,ES6中拓展的from方法可以將類陣列轉為真正的陣列,之後就可以使用陣列的常用方法
	使用方式:Array.from(arrLike, fn)
		arrLike:類陣列物件
		fn:執行的函式,有兩個引數:成員值、索引值。this預設指向window
		如果傳遞的fn引數,此時,from方法的返回值是函式的執行結果
總結:from方法不僅可以將類陣列轉為陣列,還可以遍歷類陣列物件

陣列拓展–of

of方法用於建立陣列的,是陣列的一個靜態方法
	之前通過new Array()或者Array()建立陣列有一些問題:
		1 如果沒有傳遞引數,得到的是一個空陣列
		2 如果傳遞了一個數字引數,得到的是帶有一個長度的空陣列
		3 如果傳遞一個非數字引數,得到的是帶有一個成員的陣列
		4 如果傳遞了多個引數,得到的是一個帶有多個引數的陣列
ES6中拓展的of方法可以實現將所有傳遞的引數都作為陣列中的成員存在
建立陣列的四種方式
	字面量[]	建構函式new Array()		工廠方法Array()		Array.of()

陣列拓展–查詢陣列

在ES5中拓展了查詢成員的方法:indexOf, lastIndexOf
在ES6中拓展了查詢成員的方法:find, findIndex
	引數就是執行的函式
		函式中有三個引數:成員值、索引值、原陣列
		this預設指向window
find方法在查詢成員的時候,如果找到了則返回該成員,如果沒有找到則返回undefined
findIndex方法在查詢成員的時候,如果找到了則返回該成員的索引值,如果沒有找到返回-1
在查詢的過程中,一旦找到則停止遍歷

陣列拓展–陣列內部複製

ES6為了實現陣列內部複製成員提供了一個方法:copyWithin
使用方式:
	arr.copyWithin(pos, start, end)
		pos:要貼上的位置
		start:要複製的起始位置(包含起始位置)
		end:要複製的結束位置(不包含結束位置)
		返回值就是原陣列,並且原陣列發生變化
例如:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].copyWithin(3, 6, 9)
結果:[0, 1, 2, 6, 7, 8, 6, 7, 8, 9]

陣列擴充套件–迭代器方法

ES6中為了遍歷陣列中成員,拓展了三個迭代器方法:keys, values, entries
	keys:獲取索引值
	values:獲取成員值
	entries:獲取索引值以及成員值:[index, item]
由於實現了陣列的迭代器介面方法,就可以使用for of或者是next方法遍歷
	實現了迭代器介面的資料,都有next方法,可以通過next方法來遍歷成員
		返回值是一個物件
			value:表示成員值		done:表示是否遍歷完成
		如果遍歷完成了,此時:done將永遠是true     value將永遠是undefined

for of迴圈

for of迴圈是ES6專門為實現了迭代器介面的物件設計的迴圈結構
	for of是專門為迭代器介面設定的遍歷方法。語法:for(let item of data){}
	可以像其它迴圈一樣在內部使用continue, break等關鍵字
	for of也是可以遍歷陣列的,但是在遍歷過程中,無法使用索引值
		遍歷陣列的時候,item表示陣列的每一個成員,沒有辦法訪問索引值,但是我們可以在外部定義一個迴圈變數,在迴圈體中手動更新。for of迴圈遍歷陣列的時候,不需要通過索引值訪問成員,而for迴圈以及for in迴圈要通過索引值才能訪問。
	for in也可以遍歷陣列,但是有一些問題:遍歷的時候,key顯示的是字串,不是數字
總結:for迴圈用於遍歷陣列,for in迴圈用於遍歷物件,for of迴圈遍歷實現了迭代器介面的物件(包括陣列)

解構

解析聚合資料的結構
	在ES5中的聚合資料有:物件、陣列
	在之前,物件中獲取資料的方式只能通過點語法或者中括號語法
	在之前,陣列中獲取資料的方法只能通過中括號語法
在ES6中簡化了獲取資料的方式,提供瞭解構語法:物件解構與陣列解構

物件解構

語法:let {key1, key2, ...keys} = obj;
	key1相當於obj.key1		key2相當於obj.key2
	keys獲取的是剩餘的屬性,如果沒有剩餘的屬性,獲取到的是一個空物件
注意:結構出來的屬性、變數一定是和物件中的屬性是同名的
結構問題:
	1 如果使用var解構,會汙染全域性物件(window),我們可以使用let關鍵字解決
	2 解構出來的方法,方法中的this將發生改變
	3 對於引用型別來說,只是指向的改變,而對於值型別來說,是真正的複製
逆運算:我們可以通過三個點語法,將一個物件中的所有資料傳遞給一個物件字面量中:{ ...keys }
注意:由於解構出來的資料會建立全域性變數,因此,常常配合模組化開發使用(相當於區域性變數)

陣列解構

語法: let [item1, item2, ...items] = arr;
	item1表示第一個成員		item2表示第二個成員
	items表示剩餘的成員
注意:如果使用var解構,會汙染全域性物件(window),我們可以使用let關鍵字解決
獲取剩餘成員的語法:
	1 如果陣列有剩餘的成員,獲取到的是陣列中所有的剩餘成員
	2 如果沒有剩餘的成員,獲取到的是一個空陣列
	3 前面解構的變數,可以正常使用
逆運算:我們可以通過三個點語法,將一個數組中的所有資料傳遞給一個數組字面量中:[ ...arr ](複製陣列)

預設引數

ES6提供了適配預設引數的方式,直接在引數集合中為形參賦值即可
	如果傳遞了引數,則使用傳遞的引數
	如果沒有傳遞引數,則使用預設引數
ES6拓展的適配預設引數的方式與三元運算子的方式是等價的

函式拓展–獲取剩餘引數

在之前我們可以通過arguments來獲取所有的引數,但是arguments是一個類陣列物件,不能使用陣列的常用方法,於是ES6拓展了獲取剩餘引數語法,獲取的剩餘引數是一個數組,所以可以直接使用陣列的常用方法
語法:	function demo(arg1, arg2, ...args) {}
		arg1 表示第一個引數	arg2 表示第二個引數	args表示剩餘的引數
獲取剩餘引數的語法:
	1 如果有剩餘的引數,獲取到的是一個由所有剩餘引數組成的陣列
	2 如果沒有剩餘的引數,獲取到的是一個空陣列
	3 前面引數可以正常使用,前面引數如果沒有對應的引數則是undefined
	4 在箭頭函式中有廣泛的應用
獲取剩餘引數的語法逆運用:
語法:demo(...args)
	我們可以將一個數組中的成員,作為一個引數傳遞到一個方法中
	在之前我們可以通過apply方法,將陣列中的每一項資料傳遞到一個方法中
		但是使用apply需要考慮this的指向問題
	我們可以使用獲取剩餘引數的語法,就不需要考慮this指向的問題了,正常執行函式

函式拓展–箭頭函式

在ES5中定義函式的方式:1 函式定義式	2 函式表示式		3 建構函式式
在ES6中有拓展了一種方式:箭頭函式
語法:let demo = () => {}
	():表示引數集合	=>:是箭頭函式的標誌		{}:是函式體
幾點省略語法:
	1 如果引數集合中只有一個引數,即可省略引數集合
		如果使用三個點語法獲取剩餘引數或者是解構語法,不能省略引數集合
	2 如果函式中只有一句話,或者只有返回值的時候,可以省略return以及函式體
箭頭函式的特點:
	1 無法使用arguments,但是我們可以使用三個點語法獲取剩餘的引數
	2 無法作為建構函式來使用
	3 箭頭函式中的this指向永遠是定義時的
		在普通函式中,this是執行時的上下文物件,誰呼叫指向誰
		無論使用call、apply或者是bind方法都無法改變箭頭函式的this指向
		改變箭頭函式的this指向的唯一方式就是改變其宿主環境this物件,也就是說改變其外部函式的this物件。
普通函式this是執行時的,箭頭函式this是定義時的

Symbol

在js中有6種資料型別:數字、字串、布林值、undefined、null、物件
在ES6中又添加了一種資料型別:Symbol資料型別,表示獨一無二的資料
	我們可以通過Symbol方法建立Symbol資料,引數就是對Symbol資料的描述,但是結果不受影響
	我們可以通過typeof檢視Symbol資料型別,如果引數傳遞的是物件,預設會呼叫其toString方法
Symbol資料型別的出現是為了避免物件中同名屬性被覆蓋的問題
	我們通過Symbol建立的資料型別,就可以避免物件中同名屬性被覆蓋的問題
	Symbol建立的資料不能通過for in的方式檢視,也不能通過Object.keys檢視資料
	只能通過Object.getOwnPropertySymbols檢視資料(Object.keys用來獲取物件中所有的屬性資料的)
	還可以通過變數,檢視對應的資料型別

代理

在一個系統中,總要在一個物件中,儲存一些資料,對於這些資料,可能有一些是希望我們訪問的,但是總有一些是重要的,不希望我們訪問的,希望保護起來,因此ES6新增了代理,實現了這一特徵
語法通過Proxy實現:let proxy = new Proxy(obj, {set, get})
	第一個引數:obj表示被代理的物件
	第二個引數:{set, get}表示操作被代理物件的物件
		get(obj, key)表示取值方法:
			obj表示被代理的物件			key表示獲取的屬性
			返回值很重要:就是獲取的資料	this指向操作物件
			注意:絕對不能獲取代理物件(proxy)的key屬性
		set(obj, key, value)	表示賦值方法
			obj表示被代理的物件		key表示修改的屬性		value表示修改的屬性值
			this指向操作物件		不需要返回值
			注意:絕對不能在裡面修改代理物件(proxy)的key屬性
代理跟特性很像
	特性是對同一個物件的操作,資料不能在當前屬性下儲存,儲存在備份中
	代理是對不同的物件的操作,資料可以直接儲存在當前屬性下,原物件屬性沒有發生改變

Reflect

Reflect是對物件中一些操作方法的封裝
在之前,物件中的所有方法都給了Object,這些方法都屬於內部語言方法,於是將這些方法拿出來給了Reflect,因此以後呼叫這些方法的時候,就可以通過Reflect來呼叫了
所以,在未來物件中的方法可能被移除,給了Reflect。例如:
	之前定義特性的方式:Object.defineProperty,現在定義特性的方式:Reflect.defineProperty
Reflect允許對一些操作符當作方法去執行
	has:代替in運算子,檢查某個屬性是否存在		deleteProperty:刪除物件中某一個屬性
	getOwnPropertyDescriptor:獲取某個屬性的描述特徵物件
	get:獲取屬性		set:設定資料的

聚合資料

在ES5中的聚合資料有:物件和陣列
在ES6中又添加了四種聚合資料:Set、WeakSet、Map、WeakMap
	所以在ES6中共有六種聚合資料:物件、陣列、Set、WeakSet、Map、WeakMap
Set是實現了迭代器介面的去重陣列
	在去重的時候不會做型別的轉換
	由於Set物件實現了陣列迭代器介面,所以可以使用for of語句遍歷該物件
內部提供了大量的方法用於操作該物件,屬性以及方法如下:
	size:	獲取資料的長度(屬性)		has:	判斷是否包含某個屬性
	add:	新增資料				delete:	刪除某項資料
	clear:	清空資料				forEach:用於遍歷資料
	keys, values, entries是用於獲取迭代器介面
	
	
    // 陣列去重
    var arr = [1, 2, 3, 3, 4, 1];
    var s1 = new Set(arr);
    // 使用三個點語法將set物件轉成陣列
    console.log([...s1]);


	
WeakSet物件是弱set物件,成員只能是引用型別資料
	注意:不能新增空物件null
由於是弱set物件,因此存在的方法少,只有新增add,刪除delete,判斷has是否擁有三個方法
WeakSet不能被垃圾回收機制自動回收,因此要慎用



Map是一個超級物件
	傳統的物件所有屬性名稱都必須是字串
	但是Map物件中,定義的屬性名稱可以是任意型別(7種類型都可以)
	通過new Map建立map物件,實現了迭代器介面物件,因此可以使用for of迴圈遍歷
內部也提供了大量的方法用於操作該物件,屬性以及方法如下:
	size:	獲取資料的長度(屬性)		has:	判斷是否包含某個屬性
	delete:	刪除某項資料				clear:	清空資料
    get:	獲取資料				set:	設定資料
    forEach:用於遍歷資料
	keys, values, entries是用於獲取迭代器介面	

WeakMap物件是弱map物件,屬性名稱只能是引用型別的資料
	注意:不能新增空物件null
由於是弱map物件,因此少了很多方法,只有set,get,delete,has方法,其餘的size屬性,forEach,keys,values,
entries,clear等方法都不存在了
WeakMap不能被垃圾回收機制自動回收,因此要慎用

迭代器介面

在ES6中,只實現了迭代器介面(Symbol.iterator),並沒有實現迭代器介面類,有四種情況會實現迭代器介面:
	1 使用迭代器介面方法的時候,如keys, values, entries等
	2 在解構的時候
	3 在建立map, set物件的時候
	4 在使用for of迴圈的時候
迭代器的作用:
	1 定義了我們訪問資料的次序
	2 為for of提供了訪問資料的方式
	3 讓所有資料具備統一的介面,可以方便而快捷的獲取資料
注意:類陣列物件實現了迭代器介面,物件沒有實現迭代器介面

Promise規範

Promise是將非同步寫法變為同步寫法的規範
	只是寫法的改變,操作並沒有改變
	非同步操作:在回撥函式中,一層巢狀一層
	同步操作:將方法寫在外部
三個狀態
	pending	表示操作正在執行		resolved 表示操作執行成功	rejected 表示操作執行失敗
狀態的流向:在Promise中狀態有兩個方向的流動:
	狀態由pending流向resolved,說明操作執行成功完畢
	狀態由pending流向rejected,說明操作執行失敗完畢
語法:	new Promise((resolve, reject) => {回撥函式中執行非同步操作})
	如果操作執行成功,執行resolve方法	如果操作執行失敗,執行reject方法
在外部通過then方法監聽狀態的改變
	then(success, fail)	該方法接收兩個引數
		success:表示成功時候執行的回撥函式,引數是由resolve方法執行的時候傳遞的引數(只能傳遞一個),想				傳遞多個可以放在陣列中
		fail:表示失敗時候執行的回撥函式,引數是由reject方法執行的時候傳遞的引數(只能傳遞一個)
then方法的返回值是Promise物件,因此,可以鏈式呼叫該方法
上一個then方法的輸出,將作為下一個then方法引數的輸入。如果操作已經執行完畢,then方法也會立即執行
有三個方法可以監聽Promise狀態:
	then:可以監聽狀態成功或者是失敗的方法
		定義多個then方法,此時後一個then方法可以監聽前一個then的成功與失敗
	catch:可以監聽狀態失敗時候的方法
		失敗只能被監聽一次,但是可以被後面的then繼續監聽
	finally:無論成功還是失敗都會執行的方法
		無法接收資料
Promise規範--all
	all方法用於監聽多個Promise物件
		引數是一個數組,陣列中的每一項都是一個Promise物件
	我們可以通過then方法監聽狀態的改變
		如果所有的操作都執行成功,才會執行success方法
		如果有一個操作執行失敗,則會執行fail方法
		不論是成功還是失敗,返回值是陣列,陣列中的每一個成員對應每一個Promise返回的資料
Promise規範--race
	race方法用於監聽多個Promise物件
		引數是一個數組,陣列中的每一項都是一個Promise物件
	我們可以通過then方法監聽狀態的改變(監聽第一個Promise物件狀態的改變)
		如果有一個請求執行成功,就會執行success方法
		如果有一個請求執行失敗,則會執行fail方法
		返回值是狀態改變的時候傳遞的資料
Promise規範--resolve與reject
	resolve是Promise的靜態方法,返回一個可以監聽resolved狀態的Promise物件
		引數有三種:
			js資料,此時then方法會立即執行(then方法接收的資料就是該資料)
			promise物件
			thenable引數(帶有then方法的物件)
	reject是Promise的靜態方法,返回一個可以監聽rejected狀態的物件
		then方法監聽失敗時候,回撥函式的引數就是reject方法引數(錯誤的描述資訊)
		不論reject方法是什麼資料,then都將執行失敗的回撥函式

generator函式

generator函式為處理非同步程式設計提供瞭解決辦法(非同步函式),內部封裝了大量的狀態,允許我們逐條遍歷
語法:function *demo() {函式中定義狀態}
	在函式內部通過yield關鍵字定義狀態,yield表示暫停的意思
		注意:yield關鍵字只能出現在generator函式中
	通過return定義最後一個狀態,return後面的狀態不會執行
generator函式的返回值實現了next方法,因此可以通過next方法逐條遍歷內部的狀態
	next方法的返回值是一個物件
		done屬性:表示是否遍歷完成
		value屬性:表示狀態值
next方法返回的狀態物件
	如果有狀態的情況下,done是false, value是狀態值
	如果沒有狀態,此時done是true, value是undefined
generator函式的返回值也實現了迭代器介面,因此也可以通過for of方式遍歷內部的狀態,但是for of迴圈無法遍歷			到return狀態
	但是不要同時使用兩種方式去遍歷內部的狀態,因為,一方遍歷完成,另一方就得不到狀態了
當generator函式遍歷完成之後,此時它的狀態變為closed
當generator函式沒有遍歷完成的時候,此時它的狀態變為suspended
return
	在generator函式的原型中提供了return方法,用於在外部停止內部狀態的遍歷
	如果在函式體中出現了finally語法,return語句將會延後執行
throw
	在generator函式的原型中提供了throw方法,允許在外部丟擲錯誤
	為了程式碼正常執行,我們可以在狀態函式體中通過try catch語句去捕獲錯誤
	如果外部丟擲兩個錯誤:
		第一個錯誤在狀態函式體中通過try catch語句去捕獲第一個錯誤
		第二個錯誤在狀態函式體外部通過try catch語句去捕獲第二個錯誤
generator函式的資料傳遞
在generator函式中資料傳遞有兩個方向:
	1 資料由generator函式的內部流向外部
	2 資料由generator函式的外部流向內部
資料由內部流向外部
	1 通過yield表示式定義狀態值
	2 在外部通過next方法返回的物件中的value屬性獲取
資料由外部流向內部
	1 在外部通過next方法傳遞資料
	2 在內部通過yield表示式接收資料
generator函式–yield*
yield*語法
	可以將函式內部的狀態複製到另一個函式體中執行
三個點語法
	使用三個點語法解構的時候,可以將一個狀態函式體中的所有狀態值獲取到
generator函式的this
	在generator函式中的this指向window
	所以,不能通過this去新增任何的屬性以及方法
	如果想要新增屬性或者方法,我們可以在函式執行的時候,使用call或者apply方法改變其作用域,將指向函式的原型

async與await

async和await是ES2016(ES7)中提出來的
	可以認為是generator函式的語法糖
語法糖:對一些複雜操作的簡化,可以使我們用更簡單的方式去操作,提高了開發效率
	async表示函式中有非同步操作,代表了*語法
	await表示等一等的意思,只有當前程式執行完畢之後,後續程式碼才會執行,代表了yield關鍵字
特點:
	1 提高了程式碼的語義化
	2 await返回值是Promise物件
	3 await後面允許是任何資料
	4 generator表示狀態機,async定義的是非同步函式
	5 在函式中內建狀態函式的啟動,直接執行函式即可,不需要通過next方法執行
當程式執行到await的時候,會交出程式的控制權,只有當非同步操作完畢之後,後續的程式碼才會執行
	如果await後面出現了其它資料,會返回一個監聽resolved狀態的promise物件
	如果函式中出現了錯誤,會將錯誤資訊追蹤到錯誤佇列中
返回物件
	await返回值是一個promise物件
		可以使用then方法監聽成功時候狀態
		可以使用catch方法監聽失敗時候的狀態
	await與yield一樣:
		await只能出現在async中		yield只能出現在generator函式中

在ES6中實現了類。語法:class 類名 {}
	ES6之前定義類的方式:function People(title) {this.title = title}
在類中可以定義三類資料:
	第一種例項資料:
		可以通過constructor建構函式定義自身屬性或者是方法,這類資料會被當前例項化物件所訪問
	第二種原型資料:
		我們直接在類體中定義原型方法即可。
		如果要定義原型屬性資料,則必須要使用get, set設定特性的方式來定義:get取值器,set賦值器
		由於對資料設定了特性,在檢視物件的時候,這些資料將展示在自身。
	第三種資料:靜態資料(通過類直接訪問,而例項化物件是不能訪問的)
		定義靜態資料的方式有兩種:
			1 直接在類體中,在資料的前面加上static關鍵字即可
			2 在類體的外部,直接為類新增資料
		區別:
			在類體中新增的靜態資料			設定了特性
			在類體外部新增的靜態資料		沒有設定特性

編譯ES6

使用babel編譯器將程式碼編譯成瀏覽器支援的版本
安裝node之後,可以全域性安裝babel指令:npm install -g babel-cli
配置.babelrc檔案
	通過presets配置項定義編譯器
	安裝es6的babel外掛:npm install babel-preset-es2015	注意:在專案目錄中執行
編譯檔案
	輸出到控制檯	babel 檔案
		babel .\01.js
	輸出到檔案中 	babel 檔案 --out-file 檔名
		babel .\01.js --out-file ./dist/01.js