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}
。
我們來從左到右解讀一下:
\d{3}
表示匹配3個(gè)數(shù)字荐操,例如'010'
芜抒;\s
可以匹配一個(gè)空格(也包括Tab等空白符),所以\s+
表示至少有一個(gè)空格托启,例如匹配' '
挽绩,'\t\t'
等;\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+) /;