個人筆記:學習記錄
一、數組:
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
- 由於閉包涉及到跨域訪問,所以會導致性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然後直接訪問局部變量,來減輕對執行速度的影響。