ES6 的 Set and Map

Map

// map
var m = new Map([['michael', 54],['lily', 32]])
m.get('michael')  //54
m.set('lily', 18)  
m.get('lily') //18
m.delete('lily')
m.get('lily')   //undefined

// Set和Map類似,也是一組key的集合境蔼,但不存儲(chǔ)value灶平。由于key不能重復(fù),所以箍土,在Set中逢享,沒有重復(fù)的key。
var s = new Set([1, 2, 3])
s.add(4)
console.log(s) // [1, 2, 3, 4]
s.delete(2)
console.log(s) // [1, 3, 4]

// 轉(zhuǎn)換格式取值
var m=new Map();
var n=[['po',10],['sd',20],['cz',30],['bf',40],['as',50]];
for(var i=0;i<n.length;i++){
m.set(n[i][0],n[i][1])
}
var look=m.get('po');
alert(look);

// 可用于數(shù)組去重
var arr = [1,2,1,2,2,1];
//new Set 數(shù)組去重
function unique(arr){
  return Array.from(new Set(arr));
};
//使用ES6的方法可以去重.
console.log(unique(arr));

Array.from的妙用

es6新特性中Array類多了一個(gè)靜態(tài)方法from吴藻,這個(gè)方法作用是將一個(gè)ArrayLike對(duì)象或者Iterable對(duì)象轉(zhuǎn)換成一個(gè)Array瞒爬,本文只討論ArrayLike對(duì)象相關(guān)內(nèi)容。

Iterable

遍歷Array可以采用下標(biāo)循環(huán)沟堡,遍歷Map和Set就無法使用下標(biāo)侧但。為了統(tǒng)一集合類型,ES6標(biāo)準(zhǔn)引入了新的iterable類型航罗,Array禀横、Map和Set都屬于iterable類型。

具有iterable類型的集合可以通過新的for ... of循環(huán)來遍歷粥血。

高階函數(shù)

map/reduce

arr.map((element, index, self) => ) arr.reduce((x, y) => )

// 要把[1, 3, 5, 7, 9]變換成整數(shù)13579柏锄,reduce()也能派上用場(chǎng):
var arr = [1, 3, 5, 7, 9]
arr.reduce((x, y) => x*10+y)

// 請(qǐng)把用戶輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮懜纯鳎渌懙囊?guī)范名字趾娃。輸入:['adam', 'LISA', 'barT'],輸出:['Adam', 'Lisa', 'Bart']缔御。
function normalize(arr){
  return arr.map((name) => name[0].toUpperCase() + name.substring(1).toLowerCase())
}

filter

arr.filter((element, index, self) => )

// filter 所需參數(shù)
var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
    console.log(element); // 依次打印'A', 'B', 'C'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // self就是變量arr
    return true;
});

// filter 去重
var r,arr = ['apple', 'apple', 'pear', 'grape', 'banana'];
r = arr.filter((element, index, self) => self.indexOf(element) === index)
console.log(r)

// 用filter()篩選出素?cái)?shù):
function get_primes(arr) {
  return arr.filter(element =>element<2? false : !/^(11+?)\1+$/.test(Array(element + 1).join('1')));
}

function get_primes(arr) {
  return arr.filter(function (x) {
      if (x < 2) return false;
      for (var temp = 2; temp < x; temp++) {
          if (x % temp === 0) {
              return false;
          }
      }
      return true;
  })
}

sort

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return 1;
    }
    if (x > y) {
        return -1;
    }
    return 0;
}); // [20, 10, 2, 1]

箭頭函數(shù)的作用

箭頭函數(shù)和匿名函數(shù)有個(gè)明顯的區(qū)別:箭頭函數(shù)內(nèi)部的this是詞法作用域抬闷,由上下文確定。

var obj = {
  birth: 1990,
  getAge: function () {
    var b = this.birth // 1990
    var fn = function () {
      return new Date().getFullYear() - this.birth; //this指向window或undefined
    }
  }
}

現(xiàn)在刹淌,箭頭函數(shù)完全修復(fù)了this的指向饶氏,this總是指向 詞法作用域 讥耗,也就是外層調(diào)用者obj:

var obj = {
  birth: 1990,
  getAge: function () {
    var b = this.birth // 1990
    var fn = () => new Date().getFullYear() - this.birth
    return fn
  }
}
obj.getAge(); // 25

由于this在箭頭函數(shù)中已經(jīng)按照 詞法作用域 綁定了,所以疹启,用call()或者apply()調(diào)用箭頭函數(shù)時(shí)古程,無法對(duì)this進(jìn)行綁定,即傳入的第一個(gè)參數(shù)被忽略:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth; // 1990
        var fn = (y) => y - this.birth; // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2015); // 25
// method1 遞歸法 
function aaa(n){
  if(n <= 2) return 1
  return aaa(n-1) + aaa(n-2)
}

// 迭代法 
function aaa(n) {
  var num1 = 1
  var num2 = 1
  var num3 = 0
  for(var i=0;i < n-2;i++){
    num3 = num1 + num2
    num1 = num2
    num2 = num3
  }
  return num3
}

// 測(cè)試:
fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

標(biāo)準(zhǔn)對(duì)象

更細(xì)心的同學(xué)指出喊崖,number對(duì)象調(diào)用toString()報(bào)SyntaxError:

123.toString(); // SyntaxError
遇到這種情況挣磨,要特殊處理一下:

123..toString(); // '123', 注意是兩個(gè)點(diǎn)!
12.3.toString();  // 12.3
(123).toString(); // '123'

Date

你可能觀察到了一個(gè)非常非郴缍坑爹的地方茁裙,就是JavaScript的月份范圍用整數(shù)表示是0~11,0表示一月节仿,1表示二月……

第二種創(chuàng)建一個(gè)指定日期和時(shí)間的方法是解析一個(gè)符合ISO 8601格式的字符串:

var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份晤锥,注意月份范圍是0~11,5表示六月
now.getDate(); // 24, 表示24號(hào)
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小時(shí)制
now.getMinutes(); // 49, 分鐘
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒數(shù)
now.getTime(); // 1435146562875, 以number形式表示的時(shí)間戳

var d = Date.parse('2015-06-24T19:49:22.875+08:00');
d; // 1435146562875
但它返回的不是Date對(duì)象廊宪,而是一個(gè)時(shí)間戳矾瘾。不過有時(shí)間戳就可以很容易地把它轉(zhuǎn)換為一個(gè)Date:

var d = new Date(1435146562875);
d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)

RegExp

要匹配變長的字符,在正則表達(dá)式中箭启,用 * 表示任意個(gè)字符(包括0個(gè))壕翩,用 + 表示至少一個(gè)字符,用 ? 表示0個(gè)或1個(gè)字符傅寡,用 {n} 表示n個(gè)字符放妈,用 {n,m} 表示n-m個(gè)字符:

來看一個(gè)復(fù)雜的例子: \d{3}\s+\d{3,8}

我們來從左到右解讀一下:

  1. \d{3} 表示匹配3個(gè)數(shù)字荐操,例如 '010' 芜抒;

  2. \s 可以匹配一個(gè)空格(也包括Tab等空白符),所以 \s+ 表示至少有一個(gè)空格托启,例如匹配 ' ' 挽绩, '\t\t' 等;

  3. \d{3,8} 表示3-8個(gè)數(shù)字驾中,例如 '1234567'

綜合起來模聋,上面的正則表達(dá)式可以匹配以任意個(gè)空格隔開的帶區(qū)號(hào)的電話號(hào)碼肩民。

如果要匹配 '010-12345' 這樣的號(hào)碼呢?由于 '-' 是特殊字符链方,在正則表達(dá)式中持痰,要用 '\' 轉(zhuǎn)義,所以祟蚀,上面的正則是 \d{3}\-\d{3,8} 工窍。

但是割卖,仍然無法匹配 '010 - 12345' ,因?yàn)閹в锌崭窕汲K晕覀冃枰鼜?fù)雜的匹配方式鹏溯。

進(jìn)階

要做更精確地匹配,可以用 [] 表示范圍淹仑,比如:

  • [0-9a-zA-Z\_] 可以匹配一個(gè)數(shù)字丙挽、字母或者下劃線;

  • [0-9a-zA-Z\_]+ 可以匹配至少由一個(gè)數(shù)字匀借、字母或者下劃線組成的字符串颜阐,比如 'a100''0_Z' 吓肋, 'js2015' 等等凳怨;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]* 可以匹配由字母或下劃線、$開頭是鬼,后接任意個(gè)由一個(gè)數(shù)字肤舞、字母或者下劃線、$組成的字符串屑咳,也就是JavaScript允許的變量名萨赁;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19} 更精確地限制了變量的長度是1-20個(gè)字符(前面1個(gè)字符+后面最多19個(gè)字符)。

A|B 可以匹配A或B兆龙,所以 (J|j)ava(S|s)cript 可以匹配 'JavaScript'杖爽、'Javascript''javaScript' 或者 'javascript' 紫皇。

^ 表示行的開頭慰安, ^\d 表示必須以數(shù)字開頭。

$ 表示行的結(jié)束聪铺, \d$ 表示必須以數(shù)字結(jié)束化焕。

你可能注意到了, js 也可以匹配 'jsp' 铃剔,但是加上 ^js$ 就變成了整行匹配撒桨,就只能匹配 'js' 了。

切分字符串

用正則表達(dá)式切分字符串比用固定的字符更靈活键兜,請(qǐng)看正常的切分代碼:

'a b   c'.split(' '); // ['a', 'b', '', '', 'c']

嗯凤类,無法識(shí)別連續(xù)的空格,用正則表達(dá)式試試:

'a b   c'.split(/\s+/); // ['a', 'b', 'c']

無論多少個(gè)空格都可以正常分割普气。加入 , 試試:

'a,b, c  d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']

再加入 ; 試試:

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

如果用戶輸入了一組標(biāo)簽谜疤,下次記得用正則表達(dá)式來把不規(guī)范的輸入轉(zhuǎn)化成正確的數(shù)組。

驗(yàn)證 郵箱 試試:

var re = / ^\w+[.]?\w+@\w+.\w+$ /;

var re = / ^\w+.?\w+@\w+.\w+$ /;

var re = / (<\w+\s\w+?>)\s(\w+.?\w+@\w+.\w+) /;

最后編輯于
?著作權(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)離奇詭異,居然都是意外死亡撕攒,警方通過查閱死者的電腦和手機(jī)陡鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖坪,“玉大人萍鲸,你說我怎么就攤上這事〔晾” “怎么了脊阴?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚯瞧。 經(jīng)常有香客問我嘿期,道長,這世上最難降的妖魔是什么埋合? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任备徐,我火速辦了婚禮,結(jié)果婚禮上甚颂,老公的妹妹穿的比我還像新娘蜜猾。我一直安慰自己,他們只是感情好振诬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布蹭睡。 她就那樣靜靜地躺著,像睡著了一般赶么。 火紅的嫁衣襯著肌膚如雪肩豁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天辫呻,我揣著相機(jī)與錄音清钥,去河邊找鬼。 笑死放闺,一個(gè)胖子當(dāng)著我的面吹牛循捺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雄人,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了础钠?” 一聲冷哼從身側(cè)響起恰力,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旗吁,沒想到半個(gè)月后踩萎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡很钓,尸身上長有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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暖夭。 院中可真熱鬧锹杈,春花似錦、人聲如沸鳞尔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寥假。三九已至市框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糕韧,已是汗流浹背枫振。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萤彩,地道東北人粪滤。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像雀扶,于是被迫代替她去往敵國和親杖小。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肆汹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 推薦幾個(gè)正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,493評(píng)論 9 151
  • 幾個(gè)正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    沒技術(shù)的BUG開發(fā)攻城獅閱讀 4,587評(píng)論 0 23
  • 忘了從哪收集的資料了,放這兒予权,以備不時(shí)之需昂勉。 只能輸入數(shù)字:"^[0-9]*$"。 只能輸入n位的數(shù)字:"^\d{...
    study_monkey閱讀 1,403評(píng)論 0 7
  • 初衷:看了很多視頻扫腺、文章岗照,最后卻通通忘記了,別人的知識(shí)依舊是別人的笆环,自己卻什么都沒獲得攒至。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,009評(píng)論 0 20
  • 我身邊標(biāo)標(biāo)準(zhǔn)準(zhǔn)的金星人-人民中路支行侯俊行長。第一眼給人的感覺就是帥氣躁劣、精神迫吐、正能量十足,頭發(fā)永遠(yuǎn)是標(biāo)準(zhǔn)的寸頭习绢,皮...
    e0192a30b537閱讀 193評(píng)論 0 0