【譯】六個漂亮的 ES6 技巧

爛漫草huo123 8年前發布 | 18K 次閱讀 ECMAScript

在這篇文章里,我將演示 6 種 ES6 新特性的使用技巧。在每個段落的末尾,我會指出它們在我的書 Exploring ES6 中的出處(你可以在線免費閱讀這本書)。

通過參數默認值強制要求傳參

ES6 指定默認參數在它們被實際使用的時候才會被執行,這個特性讓我們可以強制要求傳參:

/** * Called if a parameter is missing and * the default value is evaluated. */
function mandatory() {
    throw new Error("Missing parameter");
}
function foo(mustBeProvided = mandatory()) {
    return mustBeProvided;
}

函數調用 mandatory() 只有在參數 mustBeProvided 缺失的時候才會被執行。

在控制臺測試:

> foo()
Error: Missing parameter
> foo(123)
123

更多內容:

通過 for-of 循環來遍歷數組元素和索引

方法 forEach() 允許你遍歷一個數組的元素和索引:

var arr = ["a", "b", "c"];
arr.forEach(function (elem, index) {
    console.log("index = "+index+", elem = "+elem);
});
// Output:
// index = 0, elem = a
// index = 1, elem = b
// index = 2, elem = c

ES6 的 for-of 循環支持 ES6 迭代(通過 iterables 和 iterators)和解構。如果你通過數組的新方法 enteries() 再結合解構,可以達到上面 forEach 同樣的效果:

const arr = ["a", "b", "c"];
for (const [index, elem] of arr.entries()) {
    console.log(`index = ${index}, elem = ${elem}`);
}

arr.enteries() 通過索引-元素配對返回一個可迭代對象。然后通過解構數組 [index, elem] 直接得到每一對元素和索引。 console.log() 的參數是 ES6 中的模板字面量特性,這個特性帶給字符串解析模板變量的能力。

更多內容:

遍歷 Unicode 表示的字符串

一些 Unicode 編碼的字由兩個 JavaScript 字符組成,例如,emoji 表情:

字符串實現了 ES6 迭代,如果你通過迭代來訪問字符串,你可以獲得編碼過的單個字(每個字用 1 或 2 個 JavaScript 字符表示)。例如:

for (const ch of "x\uD83D\uDE80y") {
    console.log(ch.length);
}
// Output:
// 1
// 2
// 1

這讓你能夠很方便地得到一個字符串中實際的字數:

> [..."x\uD83D\uDE80y"].length
3

展開操作符 ( ... ) 將它的操作對象展開并插入數組。

更多內容:

通過變量解構交換兩個變量的值

如果你將一對變量放入一個數組,然后將數組解構賦值相同的變量(順序不同),你就可以不依賴中間變量交換兩個變量的值:

[a, b] = [b, a];

可以想象,JavaScript 引擎在未來將會針對這個模式進行特別優化,去掉構造數組的開銷。

更多內容:

通過模板字面量(template literals)進行簡單的模板解析

ES6 的模板字面量與文字模板相比,更接近于字符串字面量。但是,如果你將它們通過函數返回,你可以使用他們來做簡單的模板渲染:

const tmpl = addrs => `
    <table>
    ${addrs.map(addr => `
        <tr><td>${addr.first}</td></tr>
        <tr><td>${addr.last}</td></tr>
    `).join("")}
    </table>
`;

tmpl 函數將數組 addrs 用 map (通過 箭頭函數 ) join 拼成字符串。 tmpl() 可以批量插入數據到表格中:

const data = [
    { first: "<Jane>", last: "Bond" },
    { first: "Lars", last: "<Croft>" },
];
console.log(tmpl(data));
// Output:
// <table>
//
// <tr><td><Jane></td></tr>
// <tr><td>Bond</td></tr>
//
// <tr><td>Lars</td></tr>
// <tr><td><Croft></td></tr>
//
// </table>

更多內容:

通過子類工廠實現簡單的合成器

當 ES6 類繼承另一個類,被繼承的類可以是通過任意表達式創建的動態類:

// Function id() simply returns its parameter
const id = x => x;

class Foo extends id(Object) {}

這個特性可以允許你實現一種合成器模式,用一個函數來將一個類 C 映射到一個新的繼承了 C 的類。例如,下面的兩個函數 Storage 和 Validation 是合成器:

const Storage = Sup => class extends Sup {
    save(database) { ··· }
};
const Validation = Sup => class extends Sup {
    validate(schema) { ··· }
};

你可以使用它們去組合生成一個如下的 Employee 類:

class Person { ··· }
class Employee extends Storage(Validation(Person)) { ··· }

更多信息:

進一步閱讀

下面的兩個章節提供了很好地概括了 ECMAScript 6 的特性:

 

來自: https://www.h5jun.com/post/six-nifty-es6-tricks.html

 

 本文由用戶 爛漫草huo123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!