Class
由于ES5以前是沒(méi)有class的芯砸,所以面向?qū)ο缶幊潭际且訤unction來(lái)實(shí)現(xiàn)的萧芙,主要缺點(diǎn)就是寫(xiě)起來(lái)比較麻煩给梅,類的方法要掛在原型鏈上。
ES6中新增加了Class的概念双揪,讓類的定義變得更加簡(jiǎn)單动羽,更像面向?qū)ο螅⒁膺@里用的是“像”渔期,因?yàn)楸举|(zhì)來(lái)講ES6新增的Class屬于語(yǔ)法糖运吓,與Function除了寫(xiě)法簡(jiǎn)潔沒(méi)什么其他的區(qū)別。
Class Animal {
constructor (type) {
this.type = type
}
eat () {
console.log(this.type + ' eat')
}
// getter setter
get name () {
return this.name
}
set name (val) {
this._name = val
}
// 靜態(tài)方法
static talk () {
console.log('talk')
}
}
// 繼承
Class Dog extends Animal {
constructor (type, age) {
// 調(diào)用父類構(gòu)造方法
super(type)
this.age = age
}
run () {
console.log(this.type + ' ' + this.age + ' run')
}
}
Function
函數(shù)參數(shù)默認(rèn)值
function f(x, y = 1, z = x + y) {}
// 使用默認(rèn)值可以用undefined賦值
f(2, undefined, 3)
獲取不定參
Rest Parameter
在ES5中獲取不定參使用arguments疯趟,但在ES6中已經(jīng)被廢棄拘哨,可以使用Rest Parameter來(lái)獲取不定參
function sum (base, ...nums) {
let num = base
nums.forEach(function (item) {
num += item * 1
})
return num
}
console.log(sum(30, 1, 2, 3))// 36
console.log(sum(30, 1, 2, 3, 4))// 40
或者可以繼續(xù)使用Function.length來(lái)獲取參數(shù)數(shù)量,但是需要注意信峻,F(xiàn)unction.length獲取的事定參數(shù)量倦青,也就是第一個(gè)默認(rèn)參數(shù)前面的變量數(shù)
function test (a = 2, b = 1, c) {
console.log(test.length)
}
test('a', 'b')// 0
Spread Operator
Spread Operator 和 Rest Parameter 是形似但相反意義的操作符,簡(jiǎn)單的來(lái)說(shuō) Rest Parameter 是把不定的參數(shù)“收斂”到數(shù)組站欺,而 Spread Operator 是把固定的數(shù)組內(nèi)容“打散”到對(duì)應(yīng)的參數(shù)姨夹。示例如下:
function sum (x = 1, y = 2, z = 3) {
return x + y + z
}
console.log(sum(...[4]))// 9
console.log(sum(...[4, 5]))// 12
console.log(sum(...[4, 5, 6]))// 15
箭頭函數(shù)
ES6中新增箭頭函數(shù)纤垂,為常規(guī)函數(shù)的簡(jiǎn)寫(xiě)形式矾策,需要注意的是,箭頭函數(shù)并不修改this指向峭沦,定義函數(shù)時(shí)的this指向即為函數(shù)內(nèi)部的this指向
let hello = name => {
console.log('say hello', name)
}
// 返回值為表達(dá)式可以省略return和{}
let pow = x => x * x
// 返回值是字面量對(duì)象贾虽,需要用小括號(hào)包裹起來(lái)
let person = (name) => ({
age: 20,
addr: 'Beijing City'
})
// this指向定義時(shí)的this,所以下例中this指向test外層的window,window沒(méi)有name屬性吼鱼,所以返回undefined
let test = {
name: 'test',
say: () => {
console.log(this.name, this)
}
}
console.log(test.say())// undefined
Object
Object簡(jiǎn)寫(xiě)
var x = 0, y = 0
obj = {
x,
y
}
使用表達(dá)式定義key
let obj = {
foo: 'bar',
(['baz'+ quux()]): 42
}
函數(shù)簡(jiǎn)寫(xiě)
let obj = {
foo (a, b) {
},
bar (x, y) {
},
* quux (x, y) {
}
}
Object.assign()
此函數(shù)用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象蓬豁,返回目標(biāo)對(duì)象。
Object.assign(target, ...sources)
const target = { a: 1, b: 2 }
const source = { b: 4, c: 5 }
const returnedTarget = Object.assign(target, source)
console.log(target)
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget)
// expected output: Object { a: 1, b: 4, c: 5 }
從語(yǔ)法中可以看出源對(duì)象的個(gè)數(shù)是不限制的菇肃,如果是0個(gè)地粪,直接返回目標(biāo)對(duì)象,如果是多個(gè)琐谤,相同的屬性會(huì)被后面的源對(duì)象覆蓋蟆技。
Set 新增數(shù)據(jù)結(jié)構(gòu)
Set數(shù)據(jù)結(jié)構(gòu)可以理解為集合,其中存儲(chǔ)的數(shù)據(jù)是完全去重的斗忌,參數(shù)必須為可遍歷的质礼,數(shù)組或自定義的可遍歷結(jié)構(gòu)
let s = new Set([1, 2, 3])
// 添加數(shù)據(jù)
s.add('hello').add('world')
// 刪除數(shù)據(jù)
s.delete('hello')
// 刪除全部數(shù)據(jù)
s.clear()
// 查找數(shù)據(jù)
s.has('hello')
// 統(tǒng)計(jì)數(shù)據(jù)
s.size
// 返回所有鍵名
s.keys()
// 返回所有鍵值
s.values()
// 返回所有鍵值對(duì)
s.entries()
Map 新增數(shù)據(jù)結(jié)構(gòu)
Map數(shù)據(jù)結(jié)構(gòu)可以理解為字典,由鍵值對(duì)組成织阳,參數(shù)應(yīng)為可遍歷對(duì)象眶蕉,其元素為鍵值對(duì)
let map = new Map([['a', 1],['b', 2]])
// 添加數(shù)據(jù),已存在的鍵值會(huì)被修改
map.set('a', 2)
map.set('c', 3)
// 刪除數(shù)據(jù)
map.delete('c')
// 刪除全部數(shù)據(jù)
map.clear()
// 統(tǒng)計(jì)數(shù)據(jù)
map.size
// 查找數(shù)據(jù)
map.has('c')
// 查詢值
map.get('b')
// 返回所有鍵名
map.keys()
// 返回所有鍵值
map.values()
// 返回所有鍵值對(duì)
map.entries()
Map數(shù)據(jù)類型與Object有什么區(qū)別唧躲?
- Object的鍵可以是字符串或Symbols造挽,而Map的鍵可以為任意值碱璃,比如函數(shù),對(duì)象刽宪;
- Map中的鍵值是有序的厘贼,而添加到對(duì)象中的鍵不是,因此圣拄,當(dāng)對(duì)Map遍歷的時(shí)候嘴秸,是按照插入的順序返回鍵值;
- Map可以通過(guò)size來(lái)快速獲取鍵值對(duì)個(gè)數(shù)庇谆,而Object想要獲取鍵值對(duì)個(gè)數(shù)只能手動(dòng)計(jì)算岳掐;
- Map 可直接進(jìn)行迭代,而 Object 的迭代需要先獲取它的鍵數(shù)組饭耳,然后再進(jìn)行迭代串述;
- Map在涉及頻繁增刪鍵值對(duì)的場(chǎng)景下會(huì)較Object更有性能優(yōu)勢(shì)。
正則表達(dá)式
y修飾符
y修飾符意為粘連(Sticky)寞肖,與g修飾符類似纲酗,但不同的是g修飾符多次匹配后只要剩余字符串中存在匹配成功即可,y修飾符要求多次匹配必須從剩余字符串的首位開(kāi)始符合正則表達(dá)式新蟆,否則匹配失敗觅赊。
const s = 'aaa_aa_a'
const r1 = /a+/g
const r2 = /a+/y
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]
r2.exec(s) // null
上面代碼有兩個(gè)正則表達(dá)式,一個(gè)使用g修飾符琼稻,另一個(gè)使用y修飾符吮螺。這兩個(gè)正則表達(dá)式各執(zhí)行了兩次,第一次執(zhí)行的時(shí)候帕翻,兩者行為相同鸠补,剩余字符串都是_aa_a。由于g修飾沒(méi)有位置要求嘀掸,所以第二次執(zhí)行會(huì)返回結(jié)果紫岩,而y修飾符要求匹配必須從頭部開(kāi)始,所以返回null睬塌。
u修飾符
u修飾符含義為unicode模式泉蝌,用來(lái)處理大于\uFFFF的unicode字符,因?yàn)闈h字中有些生僻字的UTF-16編碼為四個(gè)字節(jié)衫仑,例如\uD83D\uDC2A
/^\uD83D/u.test('\uD83D\uDC2A')
// false
/^\uD83D/.test('\uD83D\uDC2A')
// true
但是梨与,ES5不支持四個(gè)字節(jié)的UTF-16編碼,會(huì)將其識(shí)別為兩個(gè)字符文狱,導(dǎo)致第二行代碼結(jié)果為true粥鞋。加了u修飾符以后,ES6就會(huì)識(shí)別其為一個(gè)字符瞄崇,所以第一行代碼結(jié)果為false呻粹。
簡(jiǎn)單來(lái)說(shuō)壕曼,所有涉及到中文的正則表達(dá)式,都加上u修飾符等浊,避免出現(xiàn)碼點(diǎn)大于\uFFFF而不能正確匹配的情況腮郊。