for-of還支持其他集合的遍歷(Map, Set),也能用于字符串遍歷(視其為Unicode字符數組);
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聲明,而生成器函數使用function*聲明。return的語法:關鍵字yield。二者的區(qū)別是,普通函數只可以return一次,而生成器函數可以yield多次(當然也可以只yield一次)。在生成器的執(zhí)行過程中,遇到yield表達式立即暫停,后續(xù)可恢復執(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()方法,函數調用將其自身解凍并一直運行到下一個yield表達式,再次暫停。iter.next()時,我們最終抵達生成器函數的末尾,所以返回結果中done的值為true。yield語句,生成器的堆棧結構(本地變量、參數、臨時值、生成器內部當前的執(zhí)行位置)被移出堆棧。然而,生成器對象保留了對這個堆棧結構的引用(備份),所以稍后調用.next()可以重新激活堆棧結構并且繼續(xù)執(zhí)行。yield的點才會暫停。.next()和[Symbol.iterator]()方法的實現。你只須編寫循環(huán)部分的行為。yield每一個值。然后將這個生成器函數作為這個對象的[Symbol.iterator]方法。.next可選參數.return.throwyield*function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
`用戶 ${user.name} 未被授權執(zhí)行 ${action} 操作。`);
}
}
action是一個對象,將會調用它的.toString()方法將其轉換為字符串值。$和{,你必須使用反斜杠將其轉義。function containsAll(haystack, ...needles) {
for (var needle of needles) {
if (haystack.indexOf(needle) === -1) {
return false;
}
}
return true;
}
數組與迭代器的解構
[ variable1, variable2, ..., variableN ] = array;
可以在對應位留空來跳過被解構數組中的某些元素
var [,,third] = ["foo", "bar", "baz"];
數組解構賦值的模式同樣適用于任意迭代器
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
對象的解構
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
解構值不是對象、數組或迭代器
var {blowUp} = null;
// TypeError: null has no properties(null沒有屬性)
var {wtf} = NaN;
console.log(wtf);
// undefined
當你要解構的屬性未定義時你可以提供一個默認值:
var [missing = true] = [];
console.log(missing);
// true
for (var [key, value] of map) { //... }| 符號 | 含義 |
|---|---|
<!-- |
單行注釋 |
--> |
“趨向于”操作符 |
<= |
小于等于 |
=> |
這又是什么? |
=>,用于lambda語法puppy => {}會被解析為沒有任何行為并返回undefined的箭頭函數。箭頭函數沒有它自己的this值
object.method()語法調用的方法使用非箭頭函數定義,這些函數需要從調用者的作用域中獲取一個有意義的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 數字類型,String 字符串類型,Object 對象類型Object.keys(obj),Object.getOwnPropertyNames(obj)Object.getOwnPropertySymbols(obj)可以列出對象的symbol鍵;Reflect.ownKeys(obj),會同時返回字符串鍵和symbol鍵Symbol()Symbol.for(string),如果同一個描述的symbol已經存在,將返回已存在的symbol對象Symbol.iterator。標準根據一些特殊用途定義了少許的幾個symbol。Object.create(null)而非直接寫{},要么得小心地避免把Object.prototype.toString之類的內置方法名作為鍵名來存儲數據。Symbol)而不能是另一個對象。for-of循環(huán)或...操作符等語法。get等)。Set, Map, WeakMap, WeakSetvar proxy = new Proxy(target, handler);proxy.[[Enumerate]](),就會返回target.[[Enumerate]]()。...
prototype?let和constvar是函數作用域let和const都是這一作用域;