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
的語法:關鍵字yield
。二者的區(qū)別是,普通函數(shù)只可以return
一次,而生成器函數(shù)可以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()
方法,函數(shù)調用將其自身解凍并一直運行到下一個yield
表達式,再次暫停。iter.next()
時,我們最終抵達生成器函數(shù)的末尾,所以返回結果中done
的值為true
。yield
語句,生成器的堆棧結構(本地變量、參數(shù)、臨時值、生成器內部當前的執(zhí)行位置)被移出堆棧。然而,生成器對象保留了對這個堆棧結構的引用(備份),所以稍后調用.next()
可以重新激活堆棧結構并且繼續(xù)執(zhí)行。yield
的點才會暫停。.next()
和[Symbol.iterator]()
方法的實現(xiàn)。你只須編寫循環(huán)部分的行為。yield
每一個值。然后將這個生成器函數(shù)作為這個對象的[Symbol.iterator]
方法。.next
可選參數(shù).return
.throw
yield*
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;
}
數(shù)組與迭代器的解構
[ variable1, variable2, ..., variableN ] = array;
可以在對應位留空來跳過被解構數(shù)組中的某些元素
var [,,third] = ["foo", "bar", "baz"];
數(shù)組解構賦值的模式同樣適用于任意迭代器
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
解構值不是對象、數(shù)組或迭代器
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的箭頭函數(shù)。箭頭函數(shù)沒有它自己的this
值
object.method()
語法調用的方法使用非箭頭函數(shù)定義,這些函數(shù)需要從調用者的作用域中獲取一個有意義的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
。標準根據(jù)一些特殊用途定義了少許的幾個symbol。Object.create(null)
而非直接寫{}
,要么得小心地避免把Object.prototype.toString
之類的內置方法名作為鍵名來存儲數(shù)據(jù)。Symbol
)而不能是另一個對象。for-of
循環(huán)或...
操作符等語法。get
等)。Set
, Map
, WeakMap
, WeakSet
var proxy = new Proxy(target, handler);
proxy.[[Enumerate]]()
,就會返回target.[[Enumerate]]()
。...
prototype
?let
和const
var
是函數(shù)作用域let
和const
都是這一作用域;