關於es6的一些常用關鍵字以及set與陣列的操作
阿新 • • 發佈:2019-01-02
因為一個數組取差集的需求,搜尋答案中順便學習了下es6的新語法,自己總結了下,感覺很有意義,希望對您有所幫助。
首先介紹下let,與var類似,但用let宣告的變數的作用域只是外層塊,而不是整個外層函式。
以下程式碼中還用到了set(一群值的集合,與陣列類似)。
//let setOfWords1 = new Set([1, 2, 3]);
//let setOfWords2 = new Set([3, 5, 2]);
var Array1 = [5,6,7,8,18,9,90,81];
var Array2 = [10,415,54,87,98,65,81];
let a = new Set(Array1);
let b = new Set(Array2);
// 並集
let unionSet = new Set([...a, ...b]);
// set轉化為陣列
let unionSet1 = Array.from(unionSet);
console.log(unionSet1);
// 交集
let intersectionSet = new Set([...a].filter(x => b.has(x)));
// set轉化為陣列
let intersectionSet1 = Array.from(intersectionSet);
console.log(intersectionSet1);
// 差集
let differenceABSet = new Set([...a].filter(x => !b.has(x)));
// set轉化為陣列
let differenceABSet1 = Array.from(differenceABSet);
console.log(differenceABSet1);
以下為es6常用關鍵字的簡介總結。
關鍵字let
let宣告的變數擁有塊級作用域。也就是說用let宣告的變數的作用域只是外層塊,而不是整個外層函式。
let宣告的全域性變數不是全域性物件的屬性。這就意味著,你不可 以通過window.變數名的方式訪問這些變數。它們只存在於一個不可見的塊的作用域中,這個塊理論上是Web頁面中執行的所有JS程式碼的外層塊。
形如for (let x…)的迴圈在每次迭代時都為x建立新的繫結。
let宣告的變數直到控制流到達該變數被定義的程式碼行時才會被裝載,所以在到達之前使用該變數會觸發錯誤。
用let重定義變數會丟擲一個語法錯誤(SyntaxError)。
關鍵字const
const宣告的變數與let宣告的變數類似,它們的不同之處在於,const宣告的變數只可以在宣告時賦值,不可隨意修改,否則會導致SyntaxError(語法錯誤)。
關鍵字set
一個Set是一群值的集合。它是可變的,能增刪元素。與陣列區別如下:
一個Set不會包含相同元素,重複加入已有元素不會產生效果。
包含性檢測。
var setOfWords = new Set([1, 2, 3, "zythum"]);
arrayOfWords = [1, 2, 3, "zythum"];
//判斷set集合中是否包含“zythum”
setOfWords.has("zythum") // 查詢速度快
true
//判斷陣列中是否包含“zythum”
arrayOfWords.indexOf("zythum") !== -1 // 查詢速度慢
true
不提供索引
以下是Set支援的所有操作:
- new Set:建立一個新的、空的Set。
- new Set(iterable):從任何可遍歷資料中提取元素,構造出一個新的集合。
- set.size:獲取集合的大小,即其中元素的個數。
- set.has(value):判定集合中是否含有指定元素,返回一個布林值。
- set.add(value):新增元素。如果與已有重複,則不產生效果。
- set.delete(value):刪除元素。如果並不存在,則不產生效果。.add()和.delete()都會返回集合自身,所以我們可以用鏈式語法。
- setSymbol.iterator:返回一個新的遍歷整個集合的迭代器。一般這個方法不會被直接呼叫,因為實際上就是它使集合能夠被遍歷,也就是說,我們可以直接寫for (v of set) {…}等等。
- set.forEach(f):直接用程式碼來解釋好了,它就像是for (let value of set) { f(value, value, set); }的簡寫,類似於陣列的.forEach()方法。
- set.clear():清空集合。
- set.keys()、set.values()和set.entries()返回各種迭代器,它們是為了相容Map而提供的,所以我們待會兒再來看。
關鍵字map
一個Map物件由若干鍵值對組成,是一種更完善的Hash結構實現,類似於物件中的鍵值對應:
var m = new Map();
m.set(o: "content");
var o = {p: "Hello World"};
- new Map:返回一個新的、空的Map。
- new Map(pairs):根據所含元素形如[key, value]的陣列pairs來建立一個新的Map。這裡提供的pairs可以是一個已有的Map 物件,可以是一個由二元陣列組成的陣列,也可以是逐個生成二元陣列的一個生成器,等等。
- map.size:返回Map中專案的個數。
- map.has(key):測試一個鍵名是否存在,類似key in obj。
- map.get(key):返回一個鍵名對應的值,若鍵名不存在則返回undefined,類似obj[key]。
- map.set(key, value):新增一對新的鍵值對,如果鍵名已存在就覆蓋。
- map.delete(key):按鍵名刪除一項,類似delete obj[key]。
- map.clear():清空Map。
- mapSymbol.iterator:返回遍歷所有項的迭代器,每項用一個鍵和值組成的二元陣列表示。
- map.forEach(f) 類似for (let [key, value] of map) { f(value, key, map); }。這裡詭異的引數順序,和Set中一樣,是對應著Array.prototype.forEach()。
- map.keys():返回遍歷所有鍵的迭代器。
- map.values():返回遍歷所有值的迭代器。
- map.entries():返回遍歷所有項的迭代器,就像mapSymbol.iterator。實際上,它們就是同一個方法,不同名字。