v-text的作用—設定標籤的文字值
阿新 • • 發佈:2020-12-28
技術標籤: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