ES6學習筆記(四)【正則,集合】

簡介

ES6對正則的擴展不多,而且幾乎全都是用不到的擴展

這一節內容會很少,但是正則依舊很常用,很重要

正文

ES6爲正則表達式新增了flags屬性,會返回正則表達式的修飾符

/abc/ig.flags
// 'gi'

以前,js只支持先行斷言(lookahead)和先行否定斷言(negative lookahead)

不支持後行斷言(lookbehind)和後行否定斷言(negative lookbehind)

而在其他腳本語言(PHP,Python等)中,都支持後行斷言和後行否定斷言

因此現在有一個提案,未來版本的js中會加入這一缺失的功能,V8 引擎已經支持此功能

思考

這部分內容希望你都可以手動敲一遍,獨立思考

瞭解正則中的先行、後行斷言麼,試着Google一下了解這個知識點


多數主流編程語言都提供了若干種複雜數據結構,而在ES6以前,js只有數組和對象兩種

ES6爲了彌補這一方面的不足,引入了四種新的數據結構

它們分別是:映射(Map)、集合(Set)、弱集合(WeakSet)和弱映射(WeakMap)

正文

Set類似數組,但是成員的值都是唯一的,沒有重複的值

let set = new Set([1, 2, 3, 3])
console.log(set)
// Set(3) {1, 2, 3}
[...set]
// [1, 2, 3]

我們可以通過給Set構造函數傳入一個數組來創建一個set,數組中的重複值被自動刪除

set常用的方法不多,常見的有以下幾種

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

另外,set通過size屬性拿到內部成員的個數,而不是數組的length

let set = new Set()
set.add(1).add(2).add(2)
set.size // 2
set.delete(2)
set.has(2) // false
set.clear()
set.size() // 0

數組的forEach方法也可以用來遍歷set,用法相同這裏不再敘述

Map類似二維數組,是鍵值對的集合,但是書寫方式稍微有不同

let map = new Map([
  ['a', '1'],
  ['b', '2']
])
console.log(map)
// Map(2) {"a" => "1", "b" => "2"}

與Set相同,Map也用size屬性表示內部有多少個鍵值對

但是從Map中新增,獲取值使用set,get方法,其他的has,delete方法與Set相同

let m = new Map()
let o = {p: 'Hello World'}

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

對比js對象的優勢是,Map可以使用任意值作爲鍵值,包括對象(上面代碼中的o)

WeakSetWeakMap不常用,顧名思義,可以理解爲更弱的Set和Map,功能少,而且容易被垃圾回收(內存消耗低)

思考

這部分內容希望你都可以手動敲一遍,獨立思考

使用Set寫一個數組去重的方法

接受一個數組參數,並返回一個沒有重複值的原數組


let set = new Set()
let a = NaN
let b = NaN
let c = {}
let d = {}
set.add(a).add(b).add(c).add(d)

此時set.size應該輸出幾?試着解釋爲什麼會是這個結果


ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值

它是JavaScript語言的第七種數據類型,前六種是:

Undefined、Null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)

正文

Symbol值與字符串類似,可以當做對象的屬性名

因爲Symbol都是獨一無二的,所以可以保證不會與其他屬性名產生衝突

Symbol值通過Symbol函數生成,Symbol函數可以接受一個字符串作爲參數,表示對Symbol的描述

主要用於調試的時候方便區分不同的Symbol值

let aaa = Symbol('a')
let bbb = Symbol('b')

let obj = {
  [aaa]: 'Hello!',
  [bbb]: 'World!'
}

console.log(obj)
// Object {Symbol(a): "Hello!", Symbol(b): "World!"}
obj[aaa]
// "Hello!"
obj[bbb]
// "World!"

思考

這部分內容希望你都可以手動敲一遍,獨立思考

如何判斷一個值是否是Symbol

試着寫出一個function,接受一個任意值作爲參數,返回它的數據類型

數據類型一共七種,在本節的簡介裏提到過

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