ES6 新特性範例大全

小編推薦:掘金是一個高質量的技術社區,從 ECMAScript 6 到 Vue.js,性能優化到開源類庫,讓你不錯過前端開發的每一個技術乾貨。各大應用市場搜索「掘金」即可下載APP,技術乾貨盡在掌握..

ECMAScript6(ECMAScript 2015 ,ES5,ES2016)技術已經在前端圈子很流行了,他給前端開發人員帶來了很多驚喜,提供的語法糖使複雜的操作變得簡單。

本文沒有詳細描述這些新特性,因爲網上都已經有很多相關的介紹了。主要針對ES6 新特性收集了相關範例代碼,他可以讓你快速瞭解這個新的javascript規範。

箭頭函數

function() 函數的簡寫表示法,但它不綁定 this

課程內容大綱 | 開篇:一線大公司對中高級前端工程師的要求

  • 1 JavaScript 測試基礎
  • 2 JavaScript 難點選講
  • 3 異步流程控制
  • 4 模塊化
  • 5 模板引擎
  • 6 webpack
  • 7 學會性能測試對比
  • 8 基於緩存的前端性能優化
  • ......
點擊報名
ES6 代碼:
  1. var odds = evens.map(v => v + 1); // no parentes and no brackets
  2. var nums = evens.map((v, i) => v + i);
  3. var pairs = evens.map(v => ({even: v, odd: v + 1}));
  4.  
  5. // Statement bodies
  6. nums.forEach(v => {
  7. if (v % 5 === 0)
  8. fives.push(v);
  9. });

this 是如何工作的?

ES6 代碼:
  1. var object = {
  2. name: "Name",
  3. arrowGetName: () => this.name,
  4. regularGetName: function() { return this.name },
  5. arrowGetThis: () => this,
  6. regularGetThis: function() { return this }
  7. }
  8.  
  9. console.log(this.name)
  10. console.log(object.arrowGetName());
  11. console.log(object.arrowGetThis());
  12. console.log(this)
  13. console.log(object.regularGetName());
  14. console.log(object.regularGetThis());

結果:

ES6 代碼:
  1. this.name ->
  2. object.arrowGetName() ->
  3. object.arrowGetThis() -> [object Window]
  4. this -> [object Window]
  5. object.regularGetName() -> Name
  6. object.regularGetThis() -> {"name":"Name"}

Classes(類)

我們知道“真正”語言中的類(Classes)。在 ES6 中類(Classes)其實是原型繼承的語法糖。

ES6 代碼:
  1. class SkinnedMesh extends THREE.Mesh {
  2. constructor(geometry, materials) {
  3. super(geometry, materials);
  4.  
  5. this.idMatrix = SkinnedMesh.defaultMatrix();
  6. this.bones = [];
  7. this.boneMatrices = [];
  8. //...
  9. }
  10. update(camera) {
  11. //...
  12. super.update();
  13. }
  14. get boneCount() {
  15. return this.bones.length;
  16. }
  17. set matrixType(matrixType) {
  18. this.idMatrix = SkinnedMesh[matrixType]();
  19. }
  20. static defaultMatrix() {
  21. return new THREE.Matrix4();
  22. }
  23. }

Lebab.io

增強的對象字面量

ES6 代碼:
  1. var theProtoObj = {
  2. toString: function() {
  3. return "The ProtoOBject To string"
  4. }
  5. }
  6.  
  7. var handler = () => "handler"
  8.  
  9.  
  10. var obj = {
  11. // __proto__
  12. __proto__: theProtoObj,
  13.  
  14. // Shorthand for ‘handler: handler’
  15. handler,
  16.  
  17. // Methods
  18. toString() {
  19.  
  20. // Super calls
  21. return "d " + super.toString();
  22. },
  23.  
  24. // Computed (dynamic) property names
  25. [ "prop_" + (() => 42)() ]: 42
  26. };
  27.  
  28. console.log(obj.handler)
  29. console.log(obj.handler())
  30. console.log(obj.toString())
  31. console.log(obj.prop_42)

結果:

ES6 代碼:
  1. obj.handler -> () => "handler"
  2. obj.handler() -> handler
  3. obj.toString() -> d The ProtoOBject To string
  4. obj.prop_42 -> 42

字符串插值

字符串插值的好語法

字符串插值

ES6 代碼:
  1. var name = "Bob", time = "today";
  2.  
  3. var multiLine = `This
  4.  
  5. Line
  6.  
  7. Spans Multiple
  8.  
  9. Lines`
  10.  
  11.  
  12. console.log(`Hello ${name},how are you ${time}?`)
  13. console.log(multiLine)

結果:

ES6 代碼:
  1. `Hello ${name},how are you ${time}?` -> Hello Bob,how are you today?
  2. multiLine -> This Line Spans Multiple Lines

解構 Destructuring

愚人碼頭注:列表匹配

ES6 代碼:
  1. // list "matching"
  2. var [a, , b] = [1,2,3];
  3. console.log(a)
  4. console.log(b)

結果:

ES6 代碼:
  1. a -> 1
  2. b -> 3

對象也能很好的解構

ES6 代碼:
  1. nodes = () => { return {op: "a", lhs: "b", rhs: "c"}}
  2. var { op: a, lhs: b , rhs: c } = nodes()
  3. console.log(a)
  4. console.log(b)
  5. console.log(c)

結果:

ES6 代碼:
  1. a -> a
  2. b -> b
  3. c -> c

使用速記表示法。

ES6 代碼:
  1. nodes = () => { return {lhs: "a", op: "b", rhs: "c"}}
  2.  
  3. // binds `op`, `lhs` and `rhs` in scope
  4. var {op, lhs, rhs} = nodes()
  5.  
  6. console.log(op)
  7. console.log(lhs)
  8. console.log(rhs)

結果:

ES6 代碼:
  1. op -> b
  2. lhs -> a
  3. rhs -> c

可在參數位置使用

ES6 代碼:
  1. function g({name: x}) {
  2. return x
  3. }
  4.  
  5. function m({name}) {
  6. return name
  7. }
  8.  
  9. console.log(g({name: 5}))
  10. console.log(m({name: 5}))

結果:

ES6 代碼:
  1. g({name: 5}) -> 5
  2. m({name: 5}) -> 5

故障弱化解構

ES6 代碼:
  1. var [a] = []
  2. var [b = 1] = []
  3. var c = [];
  4. console.log(a)
  5. console.log(b);
  6. console.log(c);

結果:

ES6 代碼:
  1. a -> undefined
  2. b -> 1
  3. c -> []

參數默認值(Default)

ES6 代碼:
  1. function f(x, y=12) {
  2. return x + y;
  3. }
  4.  
  5. console.log(f(3))
  6. console.log(f(3,2))

結果:

ES6 代碼:
  1. f(3) -> 15
  2. f(3,2) -> 5

擴展(Spread)

在函數中:

ES6 代碼:
  1. function f(x, y, z) {
  2. return x + y + z;
  3. }
  4. // 傳遞數組的每個元素作爲參數
  5. console.log(f(...[1,2,3]))

結果:

ES6 代碼:
  1. f(...[1,2,3]) -> 6

在數組中:

ES6 代碼:
  1. var parts = ["shoulders", "knees"];
  2. var lyrics = ["head", ...parts, "and", "toes"];
  3.  
  4. console.log(lyrics)

結果:

ES6 代碼:
  1. lyrics -> ["head","shoulders","knees","and","toes"]

擴展 + 對象字面量

我們可以使用這個創造很酷的對象。

ES6 代碼:
  1. let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
  2. console.log(x); // 1
  3. console.log(y); // 2
  4. console.log(z); // { a: 3, b: 4 }
  5.  
  6. // Spread properties
  7. let n = { x, y, ...z };
  8. console.log(n); // { x: 1, y: 2, a: 3, b: 4 }
  9. console.log(obj)

可惜的是它還不支持:

npm install --save-dev babel-plugin-transform-object-rest-spread

Rest

我們可以使用 rest 操作符來允許無限參數。

ES6 代碼:
  1. function demo(part1, ...part2) {
  2. return {part1, part2}
  3. }
  4.  
  5. console.log(demo(1,2,3,4,5,6))

結果:

ES6 代碼:
  1. demo(1,2,3,4,5,6) -> {"part1":1,"part2":[2,3,4,5,6]}

Let

let是新的var。 因爲它有塊級作用域。

ES6 代碼:
  1. {
  2. var globalVar = "from demo1"
  3. }
  4.  
  5. {
  6. let globalLet = "from demo2";
  7. }
  8.  
  9. console.log(globalVar)
  10. console.log(globalLet)

結果:

ES6 代碼:
  1. globalVar -> from demo1
  2. globalLet -> ReferenceError: globalLet is not defined

但是,它不會向window分配任何內容:

ES6 代碼:
  1. let me = "go"; // 全局作用域
  2. var i = "able"; // 全局作用域
  3.  
  4. console.log(window.me);
  5. console.log(window.i);

結果:

ES6 代碼:
  1. window.me -> undefined
  2. window.i -> able

不能使用let重新聲明一個變量:

ES6 代碼:
  1. let me = "foo";
  2. let me = "bar";
  3. console.log(me);

結果:

ES6 代碼:
  1. SyntaxError: Identifier 'me' has already been declared
ES6 代碼:
  1. var me = "foo";
  2. var me = "bar";
  3. console.log(me)

結果:

ES6 代碼:
  1. me -> bar

Const

const 是隻讀變量。

ES6 代碼:
  1. const a = "b"
  2. a = "a"

結果:

ES6 代碼:
  1. TypeError: Assignment to constant variable.

應該注意,const 對象仍然可以被改變的。

ES6 代碼:
  1. const a = { a: "a" }
  2. a.a = "b"
  3. console.log(a)

結果:

ES6 代碼:
  1. a -> {"a":"b"}

For..of

迭代器的新類型,可以替代for..in。 它返回的是值而不是keys

ES6 代碼:
  1. let list = [4, 5, 6];
  2.  
  3. console.log(list)
  4.  
  5. for (let i in list) {
  6. console.log(i);
  7. }

結果:

ES6 代碼:
  1. list -> [4,5,6]
  2. i -> 0
  3. i -> 1
  4. i -> 2
ES6 代碼:
  1. let list = [4, 5, 6];
  2.  
  3. console.log(list)
  4.  
  5.  
  6. for (let i of list) {
  7. console.log(i);
  8. }

結果:

ES6 代碼:
  1. list -> [4,5,6]
  2. i -> 4
  3. i -> 5
  4. i -> 6

迭代器(Iterators)

迭代器是一個比數組更動態的類型。

ES6 代碼:
  1. let infinite = {
  2. [Symbol.iterator]() {
  3. let c = 0;
  4. return {
  5. next() {
  6. c++;
  7. return { done: false, value: c }
  8. }
  9. }
  10. }
  11. }
  12.  
  13. console.log("start");
  14.  
  15. for (var n of infinite) {
  16. // truncate the sequence at 1000
  17. if (n > 10)
  18. break;
  19. console.log(n);
  20. }

結果:

ES6 代碼:
  1. "start" -> start
  2. n -> 1
  3. n -> 2
  4. n -> 3
  5. n -> 4
  6. n -> 5
  7. n -> 6
  8. n -> 7
  9. n -> 8
  10. n -> 9
  11. n -> 10

使用Typescript,我們可以看到它接口的樣子:

Typescript 代碼:
  1. interface IteratorResult {
  2. done: boolean;
  3. value: any;
  4. }
  5. interface Iterator {
  6. next(): IteratorResult;
  7. }
  8. interface Iterable {
  9. [Symbol.iterator](): Iterator
  10. }

生成器(Generators)

生成器創建迭代器,並且比迭代器更具動態性。他們不必以相同的方式跟蹤狀態 並不支持 done 的概念。

ES6 代碼:
  1. var infinity = {
  2. [Symbol.iterator]: function*() {
  3. var c = 1;
  4. for (;;) {
  5. yield c++;
  6. }
  7. }
  8. }
  9.  
  10. console.log("start")
  11. for (var n of infinity) {
  12. // truncate the sequence at 1000
  13. if (n > 10)
  14. break;
  15. console.log(n);
  16. }

結果:

ES6 代碼:
  1. "start" -> start
  2. n -> 1
  3. n -> 2
  4. n -> 3
  5. n -> 4
  6. n -> 5
  7. n -> 6
  8. n -> 7
  9. n -> 8
  10. n -> 9
  11. n -> 10

使用Typescript 再次顯示接口:

Typescript 代碼:
  1. interface Generator extends Iterator {
  2. next(value?: any): IteratorResult;
  3. throw(exception: any);
  4. }

function*  Iterators and generator

一個產量的例子*

ES6 代碼:
  1. function* anotherGenerator(i) {
  2. yield i + 1;
  3. yield i + 2;
  4. yield i + 3;
  5. }
  6.  
  7. function* generator(i) {
  8. yield i;
  9. yield* anotherGenerator(i);
  10. yield i + 10;
  11. }
  12.  
  13. var gen = generator(10);
  14.  
  15. console.log(gen.next().value);
  16. console.log(gen.next().value);
  17. console.log(gen.next().value);
  18. console.log(gen.next().value);
  19. console.log(gen.next().value);

結果:

ES6 代碼:
  1. gen.next().value -> 10
  2. gen.next().value -> 11
  3. gen.next().value -> 12
  4. gen.next().value -> 13
  5. gen.next().value -> 20

Unicode

ES6 爲Unicode 提供了更好的支持。

ES6 代碼:
  1. var regex = new RegExp('\u{61}', 'u');
  2.  
  3. console.log(regex.unicode)
  4. console.log("\uD842\uDFD7")
  5. console.log("\uD842\uDFD7".codePointAt())

結果:

ES6 代碼:
  1. regex.unicode -> true
  2. "" ->
  3. "".codePointAt() -> 134103

模塊和模塊加載器

原生支持模塊。

ES6 代碼:
  1. import defaultMember from "module-name";
  2. import * as name from "module-name";
  3. import { member } from "module-name";
  4. import { member as alias } from "module-name";
  5. import { member1 , member2 } from "module-name";
  6. import { member1 , member2 as alias2 , [...] } from "module-name";
  7. import defaultMember, { member [ , [...] ] } from "module-name";
  8. import defaultMember, * as name from "module-name";
  9. import "module-name";
ES6 代碼:
  1. export { name1, name2, …, nameN };
  2. export { variable1 as name1, variable2 as name2, …, nameN };
  3. export let name1, name2, …, nameN; // also var
  4. export let name1 = …, name2 = …, …, nameN; // also var, const
  5.  
  6. export expression;
  7. export default expression;
  8. export default function (…) { } // also class, function*
  9. export default function name1(…) { } // also class, function*
  10. export { name1 as default, };
  11.  
  12. export * from …;
  13. export { name1, name2, …, nameN } from …;
  14. export { import1 as name1, import2 as name2, …, nameN } from …;

Import Export

Set

Set 爲數學對應,其中所有項目都是唯一的。對於知道SQL的人來說,這相當於distinct

ES6 代碼:
  1. var set = new Set();
  2. set.add("Potato").add("Tomato").add("Tomato");
  3. console.log(set.size)
  4. console.log(set.has("Tomato"))
  5.  
  6. for(var item of set) {
  7. console.log(item)
  8. }

結果:

ES6 代碼:
  1. set.size -> 2
  2. set.has("Tomato") -> true
  3. item -> Potato
  4. item -> Tomato

Set

WeakSet

WeakSet對象允許您在集合中存儲弱持有的對象。沒有引用的對象將被垃圾回收。

ES6 代碼:
  1. var item = { a:"Potato"}
  2. var set = new WeakSet();
  3. set.add({ a:"Potato"}).add(item).add({ a:"Tomato"}).add({ a:"Tomato"});
  4. console.log(set.size)
  5. console.log(set.has({a:"Tomato"}))
  6. console.log(set.has(item))
  7.  
  8. for(let item of set) {
  9. console.log(item)
  10. }

結果:

ES6 代碼:
  1. set.size -> undefined
  2. set.has({a:"Tomato"}) -> false
  3. set.has(item) -> true
  4. TypeError: set[Symbol.iterator] is not a function

WeakSet

Map

Map 也稱爲詞典。

ES6 代碼:
  1. var map = new Map();
  2. map.set("Potato", 12);
  3. map.set("Tomato", 34);
  4.  
  5. console.log(map.get("Potato"))
  6.  
  7.  
  8. for(let item of map) {
  9. console.log(item)
  10. }
  11.  
  12.  
  13. for(let item in map) {
  14. console.log(item)
  15. }

結果:

ES6 代碼:
  1. map.get("Potato") -> 12
  2. item -> ["Potato",12]
  3. item -> ["Tomato",34]

可以使用除字符串之外的其他類型。

ES6 代碼:
  1. var map = new Map();
  2. var key = {a: "a"}
  3. map.set(key, 12);
  4.  
  5.  
  6. console.log(map.get(key))
  7. console.log(map.get({a: "a"}))

結果:

ES6 代碼:
  1. map.get(key) -> 12
  2. map.get({a: "a"}) -> undefined

Map

WeakMap

使用鍵的對象,並且只保留對鍵的弱引用。

ES6 代碼:
  1. var wm = new WeakMap();
  2.  
  3. var o1 = {}
  4. var o2 = {}
  5. var o3 = {}
  6.  
  7.  
  8. wm.set(o1, 1);
  9. wm.set(o2, 2);
  10. wm.set(o3, {a: "a"});
  11. wm.set({}, 4);
  12.  
  13. console.log(wm.get(o2));
  14. console.log(wm.has({}))
  15.  
  16. delete o2;
  17.  
  18. console.log(wm.get(o3));
  19.  
  20. for(let item in wm) {
  21. console.log(item)
  22. }
  23.  
  24.  
  25. for(let item of wm) {
  26. console.log(item)
  27. }

結果:

ES6 代碼:
  1. wm.get(o2) -> 2
  2. wm.has({}) -> false
  3. wm.get(o3) -> {"a":"a"}
  4. TypeError: wm[Symbol.iterator] is not a function

WeakMap

代理(Proxy)

代理可以用來改變對象的行爲。 它們允許我們定義 trap 。

ES6 代碼:
  1. var obj = function ProfanityGenerator() {
  2. return {
  3. words: "Horrible words"
  4. }
  5. }()
  6.  
  7. var handler = function CensoringHandler() {
  8. return {
  9. get: function (target, key) {
  10. return target[key].replace("Horrible", "Nice");
  11. },
  12. }
  13.  
  14. }()
  15.  
  16. var proxy = new Proxy(obj, handler);
  17.  
  18. console.log(proxy.words);

結果:

ES6 代碼:
  1. proxy.words -> Nice words

提供以下 trap :

ES6 代碼:
  1. var handler =
  2. {
  3. get:...,
  4. set:...,
  5. has:...,
  6. deleteProperty:...,
  7. apply:...,
  8. construct:...,
  9. getOwnPropertyDescriptor:...,
  10. defineProperty:...,
  11. getPrototypeOf:...,
  12. setPrototypeOf:...,
  13. enumerate:...,
  14. ownKeys:...,
  15. preventExtensions:...,
  16. isExtensible:...
  17. }

Proxy

Symbols

Symbols 是一個新類型。 可用於創建匿名屬性。

ES6 代碼:
  1. var typeSymbol = Symbol("type");
  2.  
  3. class Pet {
  4.  
  5. constructor(type) {
  6.  
  7. this[typeSymbol] = type;
  8.  
  9. }
  10. getType() {
  11. return this[typeSymbol];
  12. }
  13.  
  14. }
  15.  
  16.  
  17. var a = new Pet("dog");
  18. console.log(a.getType());
  19. console.log(Object.getOwnPropertyNames(a))
  20.  
  21.  
  22. console.log(Symbol("a") === Symbol("a"))

結果:

ES6 代碼:
  1. a.getType() -> dog
  2. Object.getOwnPropertyNames(a) -> []
  3. Symbol("a") === Symbol("a") -> false

更多信息

可繼承內置函數

我們現在可以繼承原生類。

ES6 代碼:
  1. class CustomArray extends Array {
  2.  
  3. }
  4.  
  5. var a = new CustomArray();
  6.  
  7. a[0] = 2
  8. console.log(a[0])

結果:

ES6 代碼:
  1. a[0] -> 2

不能使用數組的代理(Proxy)來覆蓋getter函數。

新類庫

各種新的方法和常量。

ES6 代碼:
  1. console.log(Number.EPSILON)
  2. console.log(Number.isInteger(Infinity))
  3. console.log(Number.isNaN("NaN"))
  4.  
  5. console.log(Math.acosh(3))
  6. console.log(Math.hypot(3, 4))
  7. console.log(Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2))
  8.  
  9. console.log("abcde".includes("cd") )
  10. console.log("abc".repeat(3) )
  11.  
  12.  
  13. console.log(Array.of(1, 2, 3) )
  14. console.log([0, 0, 0].fill(7, 1) )
  15. console.log([1, 2, 3].find(x => x == 3) )
  16. console.log([1, 2, 3].findIndex(x => x == 2))
  17. console.log([1, 2, 3, 4, 5].copyWithin(3, 0))
  18. console.log(["a", "b", "c"].entries() )
  19. console.log(["a", "b", "c"].keys() )
  20. console.log(["a", "b", "c"].values() )
  21.  
  22. console.log(Object.assign({}, { origin: new Point(0,0) }))

結果:

ES6 代碼:
  1. Number.EPSILON -> 2.220446049250313e-16
  2. Number.isInteger(Infinity) -> false
  3. Number.isNaN("NaN") -> false
  4. Math.acosh(3) -> 1.7627471740390859
  5. Math.hypot(3, 4) -> 5
  6. Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) -> 2
  7. "abcde".includes("cd") -> true
  8. "abc".repeat(3) -> abcabcabc
  9. Array.of(1, 2, 3) -> [1,2,3]
  10. [0, 0, 0].fill(7, 1) -> [0,7,7]
  11. [1, 2, 3].find(x => x == 3) -> 3
  12. [1, 2, 3].findIndex(x => x == 2) -> 1
  13. [1, 2, 3, 4, 5].copyWithin(3, 0) -> [1,2,3,1,2]
  14. ["a", "b", "c"].entries() -> {}
  15. ["a", "b", "c"].keys() -> {}
  16. ["a", "b", "c"].values() -> TypeError: ["a","b","c"].values is not a function
  17. Object.assign({}, { origin: new Point(0,0) }) -> ReferenceError: Point is not defined

文檔: NumberMathArray.fromArray.ofArray.prototype.copyWithinObject.assign

二進制和八進制

二進制和八進制數字的字面量。

ES6 代碼:
  1. console.log(0b11111)
  2. console.log(0o2342)
  3.  
  4. console.log(0xff); // also in es5

結果:

ES6 代碼:
  1. 0b11111 -> 31
  2. 0o2342 -> 1250
  3. 0xff -> 255

Promises

異步編程。

ES6 代碼:
  1. var p1 = new Promise((resolve, reject) => {
  2. setTimeout(() => resolve("1"), 101)
  3. })
  4. var p2 = new Promise((resolve, reject) => {
  5. setTimeout(() => resolve("2"), 100)
  6. })
  7.  
  8. Promise.race([p1, p2]).then((res) => {
  9. console.log(res)
  10. })
  11.  
  12. Promise.all([p1, p2]).then((res) => {
  13. console.log(res)
  14. })

結果:

ES6 代碼:
  1. res -> 2
  2. res -> ["1","2"]

快速的 Promise

ES6 代碼:
  1. var p1 = Promise.resolve("1")
  2. var p2 = Promise.reject("2")
  3.  
  4. Promise.race([p1, p2]).then((res) => {
  5. console.log(res)
  6. })

結果:

ES6 代碼:
  1. res -> 1

快速失敗

如果一個 promise 失敗,allrace也將 reject(拒絕)。

ES6 代碼:
  1. var p1 = new Promise((resolve, reject) => {
  2. setTimeout(() => resolve("1"), 1001)
  3. })
  4. var p2 = new Promise((resolve, reject) => {
  5. setTimeout(() => reject("2"), 1)
  6. })
  7.  
  8. Promise.race([p1, p2]).then((res) => {
  9. console.log("success" + res)
  10. }, res => {
  11. console.log("error " + res)
  12. })
  13.  
  14. Promise.all([p1, p2]).then((res) => {
  15. console.log("success" + res)
  16. }, res => {
  17. console.log("error " + res)
  18. })

結果:

ES6 代碼:
  1. "error " + res -> error 2
  2. "error " + res -> error 2

更多信息

反射(Reflect)

新類型的元編程與新的API現有的還有一些新的方法。

ES6 代碼:
  1. var z = {w: "Super Hello"}
  2. var y = {x: "hello", __proto__: z};
  3.  
  4. console.log(Reflect.getOwnPropertyDescriptor(y, "x"));
  5. console.log(Reflect.has(y, "w"));
  6. console.log(Reflect.ownKeys(y, "w"));
  7.  
  8. console.log(Reflect.has(y, "x"));
  9. console.log(Reflect.deleteProperty(y,"x"))
  10. console.log(Reflect.has(y, "x"));

結果:

ES6 代碼:
  1. Reflect.getOwnPropertyDescriptor(y, "x") -> {"value":"hello","writable":true,"enumerable":true,"configurable":true}
  2. Reflect.has(y, "w") -> true
  3. Reflect.ownKeys(y, "w") -> ["x"]
  4. Reflect.has(y, "x") -> true
  5. Reflect.deleteProperty(y,"x") -> true
  6. Reflect.has(y, "x") -> false

更多信息

尾調用(Tail Call)優化

尾調用的概念非常簡單,一句話就能說清楚,就是指某個函數的最後一步是調用另一個函數。

ES6可以確保尾調用不會造成堆棧溢出。 (不是所有的實現工作)。

ES6 代碼:
  1. function factorial(n, acc = 1) {
  2. if (n <= 1) return acc;
  3. return factorial(n - 1, n * acc);
  4. }
  5. console.log(factorial(10))
  6. console.log(factorial(100))
  7. console.log(factorial(1000))
  8. console.log(factorial(10000))
  9. console.log(factorial(100000))
  10. console.log(factorial(1000000))

結果:

ES6 代碼:
  1. factorial(10) -> 3628800
  2. factorial(100) -> 9.332621544394418e+157
  3. factorial(1000) -> Infinity
  4. factorial(10000) -> Infinity
  5. factorial(100000) -> RangeError: Maximum call stack size exceeded
  6. factorial(1000000) -> RangeError: Maximum call stack size exceeded

原文:ES6 Features

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章