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);
}
迭代器對象
[Symbol.iterator]()的對象被稱為可迭代的.next()方法的對象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)行到下一個yield表達(dá)式,再次暫停。iter.next()時,我們最終抵達(dá)生成器函數(shù)的末尾,所以返回結(jié)果中done的值為true。yield語句,生成器的堆棧結(jié)構(gòu)(本地變量、參數(shù)、臨時值、生成器內(nèi)部當(dāng)前的執(zhí)行位置)被移出堆棧。然而,生成器對象保留了對這個堆棧結(jié)構(gòu)的引用(備份),所以稍后調(diào)用.next()可以重新激活堆棧結(jié)構(gòu)并且繼續(xù)執(zhí)行。yield的點才會暫停。.next()和[Symbol.iterator]()方法的實現(xiàn)。你只須編寫循環(huán)部分的行為。yield每一個值。然后將這個生成器函數(shù)作為這個對象的[Symbol.iterator]方法。.next可選參數(shù).return.throwyield*function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
`用戶 ${user.name} 未被授權(quán)執(zhí)行 ${action} 操作。`);
}
}
action是一個對象,將會調(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;
可以在對應(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
對象的解構(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)值不是對象、數(shù)組或迭代器
var {blowUp} = null;
// TypeError: null has no properties(null沒有屬性)
var {wtf} = NaN;
console.log(wtf);
// undefined
當(dāng)你要解構(gòu)的屬性未定義時你可以提供一個默認(rèn)值:
var [missing = true] = [];
console.log(missing);
// true
for (var [key, value] of map) { //... }| 符號 | 含義 |
|---|---|
<!-- |
單行注釋 |
--> |
“趨向于”操作符 |
<= |
小于等于 |
=> |
這又是什么? |
=>,用于lambda語法puppy => {}會被解析為沒有任何行為并返回undefined的箭頭函數(shù)。箭頭函數(shù)沒有它自己的this值
object.method()語法調(diào)用的方法使用非箭頭函數(shù)定義,這些函數(shù)需要從調(diào)用者的作用域中獲取一個有意義的this值。ES6的方法語法
// ES6
{
...
addAll: function addAll(pieces) {
_.each(pieces, piece => this.add(piece));
},
...
}
// ===>>>
// ES6的方法語法
{
...
addAll(pieces) {
_.each(pieces, piece => this.add(piece));
},
...
}
// 創(chuàng)建一個獨一無二的symbol
var isMoving = Symbol("isMoving");
...
if (!element[isMoving]) {
smoothAnimations(element);
}
element[isMoving] = true;
Symbol是JavaScript的第七種原始類型:Undefined 未定義,Null 空值,Boolean 布爾類型,Number 數(shù)字類型,String 字符串類型,Object 對象類型Object.keys(obj),Object.getOwnPropertyNames(obj)Object.getOwnPropertySymbols(obj)可以列出對象的symbol鍵;Reflect.ownKeys(obj),會同時返回字符串鍵和symbol鍵Symbol()Symbol.for(string),如果同一個描述的symbol已經(jīng)存在,將返回已存在的symbol對象Symbol.iterator。標(biāo)準(zhǔn)根據(jù)一些特殊用途定義了少許的幾個symbol。Object.create(null)而非直接寫{},要么得小心地避免把Object.prototype.toString之類的內(nèi)置方法名作為鍵名來存儲數(shù)據(jù)。Symbol)而不能是另一個對象。for-of循環(huán)或...操作符等語法。get等)。Set, Map, WeakMap, WeakSetvar proxy = new Proxy(target, handler);proxy.[[Enumerate]](),就會返回target.[[Enumerate]]()。...
prototype?let和constvar是函數(shù)作用域let和const都是這一作用域;