ES6:Class & Function & Object & 正則

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ū)別唧躲?

  1. Object的鍵可以是字符串或Symbols造挽,而Map的鍵可以為任意值碱璃,比如函數(shù),對(duì)象刽宪;
  2. Map中的鍵值是有序的厘贼,而添加到對(duì)象中的鍵不是,因此圣拄,當(dāng)對(duì)Map遍歷的時(shí)候嘴秸,是按照插入的順序返回鍵值;
  3. Map可以通過(guò)size來(lái)快速獲取鍵值對(duì)個(gè)數(shù)庇谆,而Object想要獲取鍵值對(duì)個(gè)數(shù)只能手動(dòng)計(jì)算岳掐;
  4. Map 可直接進(jìn)行迭代,而 Object 的迭代需要先獲取它的鍵數(shù)組饭耳,然后再進(jìn)行迭代串述;
  5. 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而不能正確匹配的情況腮郊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筹燕,隨后出現(xiàn)的幾起案子轧飞,更是在濱河造成了極大的恐慌,老刑警劉巖撒踪,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件过咬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡制妄,警方通過(guò)查閱死者的電腦和手機(jī)掸绞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耕捞,“玉大人衔掸,你說(shuō)我怎么就攤上這事“吵椋” “怎么了敞映?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凌埂。 經(jīng)常有香客問(wèn)我驱显,道長(zhǎng)诗芜,這世上最難降的妖魔是什么瞳抓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伏恐,結(jié)果婚禮上孩哑,老公的妹妹穿的比我還像新娘。我一直安慰自己翠桦,他們只是感情好横蜒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著销凑,像睡著了一般丛晌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斗幼,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天澎蛛,我揣著相機(jī)與錄音,去河邊找鬼蜕窿。 笑死谋逻,一個(gè)胖子當(dāng)著我的面吹牛呆馁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毁兆,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浙滤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了气堕?” 一聲冷哼從身側(cè)響起纺腊,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茎芭,沒(méi)想到半個(gè)月后摹菠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骗爆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年次氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘投。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煮寡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犀呼,到底是詐尸還是另有隱情幸撕,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布外臂,位于F島的核電站坐儿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宋光。R本人自食惡果不足惜貌矿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罪佳。 院中可真熱鬧逛漫,春花似錦、人聲如沸赘艳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蕾管。三九已至枷踏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掰曾,已是汗流浹背旭蠕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人下梢。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓客蹋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親孽江。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讶坯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容