es6新整理

個人筆記:學習記錄

一、數組:

1. 求數組最大數:
// ES5寫法
Math.math.apply(null, [14, 3, 77]);
// ES6寫法
Math.max(...[14, 3, 77]);
// 等同於
Math.max(14, 3, 77);
2. 將一個數組添加到另一個數組的尾部
// ES5寫法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6寫法
arr1.push(...arr2)
3. 擴展運算符的應用
(1)複製數組

數組是複合的數據類型,直接複製的話,只是複製了指向底層數據結構的指針,而不是克隆一個全新的數組。例:

const a1 = [1, 2];
const a2 = a1;

a2[0] = 2;
a1 // [2, 2]

ES5方法:

const a1 = [1, 2];
const a2 = a1.concat();

a2[0] = 2;
a1 // [1, 2]

ES6使用拓展運算符:

const a1 = [1, 2];
// 寫法一
const a2 = [...a1];
// 寫法二
const [...a2] = a1;
(2)合併數組

不過這兩種方法都是淺拷貝,使用的時候需要注意。

const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// ES5 的合併數組
arr1.concat(arr2, arr3);
// ['a', 'b', 'c', 'd', 'e']

// ES6 的合併數組
[...arr1, ...arr2, ...arr3]
// ['a', 'b', 'c', 'd', 'e']
const a1 = [{foo: 1}];
const a2 = [{bar: 2}];

const a3 = a1.concat(a2);
const a4 = [...a1, ...a2];

a3[0] === a1[0]; // true
a4[0] === a1[0]; // true
(3) 與解構賦值結合

擴展運算符可以與解構賦值結合起來,用於生成數組。

// ES5 
a = list[0], rest = list,splice(1);

// ES6 
[a, ...rest] = list
(4) 字符串

擴展運算符還可以將字符串轉爲真正的數組

[...'hello']
// ['h', 'e', 'l', 'l', 'o']

(5) 實現了 Iterator 接口的對象

任何定義了遍歷器(Iterator)接口的對象,都可以用擴展運算符轉爲真正的數組。

二、對象

Set

es6提供了新的數據結構set。類似於數組,但是成員的值都是唯一的,沒有重複值。

Set本身是一個構造函數,用來生成Set數據結構

const s = new Set();
[2, 3, 4, 5, 4, 2, 3].forEach(x => s.add(x));

for(let i of s) {
    console.log(i);
    // 2 3 4 5
}

用途:
// 去除數組的重複成員
[...new Set(array)]

// 去除字符串裏面的重複字符
[...new Set('ababbc')].join('')

Set實例的屬性和方法
Set結構的實例有以下屬性:
  • Set.prototype.constructor :構造函數,默認就是 Set 函數。
  • Set.prototype.size :返回 Set 實例的成員總數。
Set 實例的方法分爲兩大類:操作方法和遍歷方法

(1)操作方法(4個)

  • set.prototype.add(value) :添加某個值,返回Set結構本身;
  • set.prototype.delete(value) :刪除某個值,返回一個布爾值,表示刪除是否成功;
  • set.prototype.has(value) :返回一個布爾值,表示該值是否爲Set的成員;
  • set.prototype.clear():清除所有成員,沒有返回值。

(2)遍歷操作(4個)

  • Set.prototype.keys():返回鍵名的遍歷器;
  • Set.prototype.values():返回鍵值得遍歷器;
  • Set.prototype.entries():返回鍵值對的遍歷器;
  • Set.prototype.foreach():使用回調函數遍歷每個成員。

Promise 對象

含義:Promise是異步編程的一種解決方案。
兩個特點:
  • 對象的狀態不收外界影響。Promise對象代表一個異步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。
  • 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
缺點:
  • 無法取消 Promise,一旦新建就會立即執行,無法中途取消。
  • 如果不設置回調函數, Promise 內部拋出的錯誤,不會反映到外部。
  • 當處於 pending 狀態時,無法得知目前進展到哪一階段(剛剛開始還是即將完成)。
基本用法
const promise = new Promise(function(resolve, reject){
    // some code
    
    if(/* 異步操作成功 */){
       resolve(value);
	} else {
       reject(error);                     
    }
})

Promise 實例生成以後,可以用then方法分別制定 resolved狀態和rejected狀態的回調函數。

promise.then(function(value){
    // success
}, function(error) {
    // failure
});

js 閉包

特性:

  • 函數嵌套函數
  • 函數內部可以引用函數外部的參數和變量
  • 參數和變量不會被垃圾回收機制回收

優點:

  • 保護函數內的變量安全,實現封裝,防止變量流入其他環境發生命名衝突
  • 在內存中維持一個變量,可以做緩存(多了會消耗內存)
  • 匿名自執行函數可以減少內存消耗

缺點:

  • 被引用的私有變量不能被銷燬,增大了內存消耗,解決辦法是可以在使用完變量後爲他復賦值爲null
  • 由於閉包涉及到跨域訪問,所以會導致性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然後直接訪問局部變量,來減輕對執行速度的影響。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章