for-of還支持其他集合的遍歷(Map
, Set
),也能用于字符串遍歷(視其為Unicode字符數(shù)組);
for (var value of myArray) {
console.log(value);
}
var uniqueWords = new Set(words);
for (var word of uniqueWords) {
console.log(word);
}
for (var [key, value] of phoneBookMap) {
console.log(key + "'s phone number is: " + value);
}
迭代器對(duì)象
[Symbol.iterator]()
的對(duì)象被稱為可迭代的.next()
方法的對(duì)象var zeroesForeverIterator = {
[Symbol.iterator]: function () {
return this;
},
next: function () {
return {done: false, value: 0};
}
};
function* quips(name) {
yield "你好 " + name + "!";
yield "希望你能喜歡這篇介紹ES6的譯文";
if (name.startsWith("X")) {
yield "你的名字 " + name + " 首字母是X,這很酷!";
}
yield "我們下次再見!";
}
function
聲明,而生成器函數(shù)使用function*
聲明。return
的語法:關(guān)鍵字yield
。二者的區(qū)別是,普通函數(shù)只可以return
一次,而生成器函數(shù)可以yield
多次(當(dāng)然也可以只yield
一次)。在生成器的執(zhí)行過程中,遇到yield
表達(dá)式立即暫停,后續(xù)可恢復(fù)執(zhí)行狀態(tài)。> var iter = quips("jorendorff");
[object Generator]
> iter.next()
{ value: "你好 jorendorff!", done: false }
> iter.next()
{ value: "希望你能喜歡這篇介紹ES6的譯文", done: false }
> iter.next()
{ value: "我們下次再見!", done: false }
> iter.next()
{ value: undefined, done: true }
.next()
方法,函數(shù)調(diào)用將其自身解凍并一直運(yùn)行到下一個(gè)yield
表達(dá)式,再次暫停。iter.next()
時(shí),我們最終抵達(dá)生成器函數(shù)的末尾,所以返回結(jié)果中done
的值為true
。yield
語句,生成器的堆棧結(jié)構(gòu)(本地變量、參數(shù)、臨時(shí)值、生成器內(nèi)部當(dāng)前的執(zhí)行位置)被移出堆棧。然而,生成器對(duì)象保留了對(duì)這個(gè)堆棧結(jié)構(gòu)的引用(備份),所以稍后調(diào)用.next()
可以重新激活堆棧結(jié)構(gòu)并且繼續(xù)執(zhí)行。yield
的點(diǎn)才會(huì)暫停。.next()
和[Symbol.iterator]()
方法的實(shí)現(xiàn)。你只須編寫循環(huán)部分的行為。yield
每一個(gè)值。然后將這個(gè)生成器函數(shù)作為這個(gè)對(duì)象的[Symbol.iterator]
方法。.next
可選參數(shù).return
.throw
yield*
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
`用戶 ${user.name} 未被授權(quán)執(zhí)行 ${action} 操作。`);
}
}
action
是一個(gè)對(duì)象,將會(huì)調(diào)用它的.toString()
方法將其轉(zhuǎn)換為字符串值。$
和{
,你必須使用反斜杠將其轉(zhuǎn)義。function containsAll(haystack, ...needles) {
for (var needle of needles) {
if (haystack.indexOf(needle) === -1) {
return false;
}
}
return true;
}
數(shù)組與迭代器的解構(gòu)
[ variable1, variable2, ..., variableN ] = array;
可以在對(duì)應(yīng)位留空來跳過被解構(gòu)數(shù)組中的某些元素
var [,,third] = ["foo", "bar", "baz"];
數(shù)組解構(gòu)賦值的模式同樣適用于任意迭代器
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth] = fibs();
console.log(sixth);
// 5
對(duì)象的解構(gòu)
var robotA = { name: "Bender" };
var { name: nameA } = robotA;
console.log(nameA);
// "Bender"
var { foo, bar } = { foo: "lorem", bar: "ipsum" };
console.log(foo);
// "lorem"
var { missing } = {};
console.log(missing);
// undefined
解構(gòu)值不是對(duì)象、數(shù)組或迭代器
var {blowUp} = null;
// TypeError: null has no properties(null沒有屬性)
var {wtf} = NaN;
console.log(wtf);
// undefined
當(dāng)你要解構(gòu)的屬性未定義時(shí)你可以提供一個(gè)默認(rèn)值:
var [missing = true] = [];
console.log(missing);
// true
for (var [key, value] of map) { //... }
符號(hào) | 含義 |
---|---|
<!-- |
單行注釋 |
--> |
“趨向于”操作符 |
<= |
小于等于 |
=> |
這又是什么? |
=>
,用于lambda語法puppy => {}
會(huì)被解析為沒有任何行為并返回undefined的箭頭函數(shù)。箭頭函數(shù)沒有它自己的this
值
object.method()
語法調(diào)用的方法使用非箭頭函數(shù)定義,這些函數(shù)需要從調(diào)用者的作用域中獲取一個(gè)有意義的this
值。ES6的方法語法
// ES6
{
...
addAll: function addAll(pieces) {
_.each(pieces, piece => this.add(piece));
},
...
}
// ===>>>
// ES6的方法語法
{
...
addAll(pieces) {
_.each(pieces, piece => this.add(piece));
},
...
}
// 創(chuàng)建一個(gè)獨(dú)一無二的symbol
var isMoving = Symbol("isMoving");
...
if (!element[isMoving]) {
smoothAnimations(element);
}
element[isMoving] = true;
Symbol
是JavaScript的第七種原始類型:Undefined 未定義,Null 空值,Boolean 布爾類型,Number 數(shù)字類型,String 字符串類型,Object 對(duì)象類型Object.keys(obj)
,Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj)
可以列出對(duì)象的symbol鍵;Reflect.ownKeys(obj)
,會(huì)同時(shí)返回字符串鍵和symbol鍵Symbol()
Symbol.for(string)
,如果同一個(gè)描述的symbol已經(jīng)存在,將返回已存在的symbol對(duì)象Symbol.iterator
。標(biāo)準(zhǔn)根據(jù)一些特殊用途定義了少許的幾個(gè)symbol。Object.create(null)
而非直接寫{}
,要么得小心地避免把Object.prototype.toString
之類的內(nèi)置方法名作為鍵名來存儲(chǔ)數(shù)據(jù)。Symbol
)而不能是另一個(gè)對(duì)象。for-of
循環(huán)或...
操作符等語法。get
等)。Set
, Map
, WeakMap
, WeakSet
var proxy = new Proxy(target, handler);
proxy.[[Enumerate]]()
,就會(huì)返回target.[[Enumerate]]()
。...
prototype
?let
和const
var
是函數(shù)作用域let
和const
都是這一作用域;