引用類型
對(duì)象是某個(gè)特定的引用類型的實(shí)例
5.1 Object類型:大多數(shù)引用類型的值都是Object的實(shí)例
- 對(duì)象屬性可以通過(guò)點(diǎn)或者方括號(hào)訪問(wèn)
alert(person["name"]);
alert(person.name);
//屬性中包含會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤的字符
//或者屬性名使用關(guān)鍵字或者保留字,可以使用方括號(hào)表示法
alert(person["first name"]);
5.2 Array對(duì)象
- Array instanceof Object //true
- 數(shù)組每一項(xiàng)都可以保存任何數(shù)據(jù)類型,數(shù)組大小和長(zhǎng)度可以動(dòng)態(tài)調(diào)整
5.2.1 檢測(cè)數(shù)組: Array.isArray()
- instanceof Array: 頁(yè)面存在多個(gè)框架,不同框架下有不同的全局環(huán)境則有不同版本的Array構(gòu)造函數(shù),一個(gè)框架的數(shù)組傳遞到另一個(gè)框架是此方法會(huì)失效
- Array.isArray(): es6新增確定是否為數(shù)組能解決上面的問(wèn)題
5.2.2 轉(zhuǎn)換方法
5.2.3 棧方法:(先進(jìn)后出)
- Array.push()添加任意數(shù)據(jù)到數(shù)組尾部,并返回?cái)?shù)組新長(zhǎng)度
- Array.pop()移除數(shù)組最后一項(xiàng)并返回這一項(xiàng)的值
5.2.4 隊(duì)列方法:(先進(jìn)先出)
- Array.push()同上
- Array.shit()移除第一項(xiàng),并返回該項(xiàng)的值
- Array.unshit()和push相反,在數(shù)組的前端添加任意數(shù)據(jù),并返回?cái)?shù)組新長(zhǎng)度
5.2.5 重排序方法
- reverse() 反轉(zhuǎn)數(shù)組的順序,返回排序后的數(shù)組
- sort() 數(shù)組從小到大排序(升序排序),返回排序后的數(shù)組。此方法對(duì)數(shù)字字符串比較無(wú)效如'10'在'5'前,可以加入自定義比較函數(shù)
function compare(val1, val2) {
if(val1 < val2) {
return 1; //1則調(diào)換
}else if(val1 > val2){
return -1;
}else {
return 0;
}
}
var arr = [0, 1, 2];
arr.sort(compare); //[2,1,0]
5.2.6 操作方法
- Array.concat(arr1, arr2[,arr3.....]);合并多個(gè)數(shù)組,將這些數(shù)組合并且返回合并的數(shù)組。
- Array.slice(start[, end]);接受一個(gè)或兩個(gè)參數(shù),即返回項(xiàng)的開(kāi)始和結(jié)束位置,返回按位置取得的數(shù)組(可以用負(fù)數(shù)即倒數(shù)第幾個(gè))
- Array.splice(start, num, data):返回從原數(shù)組刪除的項(xiàng),沒(méi)有刪除則為空數(shù)組
- start: 開(kāi)始位置
- num: 刪除數(shù)組內(nèi)num項(xiàng)
- data: 插入的數(shù)據(jù)
arr1.splice(0, 2); //刪除前兩項(xiàng)
arr1.splice(2, 0, 'red', 'green'); //從位置2開(kāi)始插入'red'和'green'
arr1.splice(2, 1, 'red', 'green'); //刪除當(dāng)前位置2的項(xiàng),后從位置2開(kāi)始插入
5.2.7 位置方法(返回值在數(shù)組中的位置索引)
- 下面兩個(gè)方法都有2個(gè)參數(shù)要找的值和開(kāi)始位置(可選)
- indexof(val [, start]);默認(rèn)從頭開(kāi)始,向后找
- lastIndexOf(val [, start]);默認(rèn)從尾部開(kāi)始,向前找
5.2.8 迭代方法 //以下方法都不會(huì)改變?cè)瓟?shù)組每一項(xiàng)的值
- every(item, index, array) 對(duì)每一項(xiàng)運(yùn)行指定函數(shù),如果數(shù)組的每一項(xiàng)都返回true,則返回true否則false
- some(item, index, array) 對(duì)每一項(xiàng)運(yùn)行指定函數(shù),數(shù)組中任一項(xiàng)執(zhí)行函數(shù)后返回true,則返回true否則false
- filter(item, index, array) 對(duì)每一項(xiàng)運(yùn)行指定函數(shù),返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組
- forEach(item, index, array) 對(duì)每一項(xiàng)運(yùn)行指定函數(shù),沒(méi)有返回值
- map(item, index, array) 對(duì)每一項(xiàng)運(yùn)行指定函數(shù),返回每次調(diào)用的結(jié)果組成的數(shù)組
5.2.9 縮小方法
- 4個(gè)參數(shù):前一個(gè)值,當(dāng)前值,項(xiàng)的索引,該數(shù)組對(duì)象。這個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)
- reduce(prev, cur, index, arr) 數(shù)組第一項(xiàng)開(kāi)始從頭到尾
- reduceRight(prev, cur, index, arr) 數(shù)組最后一項(xiàng)開(kāi)始到頭部
var arr = [1, 2, 3, 4, 5];
var sum = arr.reduce((prev, cur, index, arr)=> {
return prev + cur;
})
alert(sum);//15
5.3 Date類型
5.4 RegExp類型: js通過(guò)RegExp類型來(lái)支持正則表達(dá)式
- 創(chuàng)建方式:
- var expression = /pattern/ attributes; //直接量語(yǔ)法
- var expression = new RegExp(pattern, attributes);
- 參數(shù)
- pattern: 一個(gè)字符串,指定了正則表達(dá)式的模式或者其他正則表達(dá)式
- attributes: 一個(gè)可選字符串,包含(g, i, m)分別是全局匹配(找到所有匹配并非找到第一個(gè)就停止),執(zhí)行大小寫不敏感, 執(zhí)行多行匹配(到達(dá)第一行末尾時(shí)仍會(huì)找下一行)
- 拋出異常
- SyntaxError : pattern非合法的正則表達(dá)式,或者attributes有g(shù), i, m之外的參數(shù)
- TypeError : 若pattern是RegExp對(duì)象,但沒(méi)有省略attributes參數(shù)
- 實(shí)例屬性: 獲取正則表達(dá)式各方面信息
- global: boolean,表示是否設(shè)置g標(biāo)志
- ignpreCase : boolean , 是否設(shè)置i
- multiline : boolean 是否設(shè)置m
- lastIndex: 整數(shù),開(kāi)始搜索下一個(gè)匹配項(xiàng)的字符位置,默認(rèn)0開(kāi)始(匹配一次后lastIndex會(huì)更新成上次匹配成功的地方)
- source : 返回字面量形式的字符串模板
var re1 = /\[bc\]at/i;
alert(re1.source); //"\[bc\]at"
var re2 = new RegExp("\\[bc\\]at", "i");
alert(re2.source); //"\[bc\]at"
+ RegExp對(duì)象方法
- RegExp.compile() 編譯正則表達(dá)式
- RegExp.exec() 檢索字符串指定的值,返回找到的值,并確定其位置
- RegExp.test() 檢索字符串指定的值,返回true或者false
5.5 function類型:函數(shù)實(shí)際上是對(duì)象,函數(shù)名實(shí)際也是指向?qū)ο蟮闹羔?,一個(gè)函數(shù)可能多個(gè)名字
5.5.1 沒(méi)有重載
5.5.2 函數(shù)聲明與函數(shù)表達(dá)式
+ 解析器會(huì)優(yōu)先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼前可用(可訪問(wèn)),二函數(shù)表達(dá)式則必須等到解析器執(zhí)行到其所在代碼,才會(huì)被真正解析執(zhí)行
//正常運(yùn)行
alert(get1(10));
function get1(num) {
return num;
}
//產(chǎn)生錯(cuò)誤
alert(get2(10));
var get2 = function(num) {
return num;
}
5.5.3 作為值的函數(shù): 函數(shù)可以作為參數(shù)傳遞
+ 若訪問(wèn)函數(shù)的指針而不執(zhí)行的話,必須去掉函數(shù)名后面的那對(duì)圓括號(hào)
5.5.4 函數(shù)內(nèi)部屬性: this 和 arguments
+ arguments:主要用于保存函數(shù)參數(shù),但還有個(gè)callee的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)
//arguments.callee可以減少遞歸時(shí)和函數(shù)名的耦合
function factorial(n) {
if (n<=1) { return 1 }
else { return num * arguments.callee(n-1) }
}
- this: 引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象
- 函數(shù)中this到底取何值,是函數(shù)真正被調(diào)用是決定的,定義時(shí)決定不了
- caller: es6新的函數(shù)對(duì)象屬性: 保存著調(diào)用當(dāng)前很熟的函數(shù)引用
5.5.5 函數(shù)屬性和方法:函數(shù)是對(duì)象,故函數(shù)也有屬性和方法。 - 每個(gè)函數(shù)都有兩個(gè)屬性
- length: 函數(shù)希望接收的命名參數(shù)個(gè)數(shù)
- prototype:
- 每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法: apply(), call()
- 作用: 在特定作用域中調(diào)用函數(shù)
- apply(obj, 參數(shù)數(shù)組): 一個(gè)是在其中運(yùn)行函數(shù)的作用域,另外一個(gè)是參數(shù)數(shù)組(可以是Array實(shí)例也可以是arguments對(duì)象)即需要傳入的參數(shù)。
- call(obj[, 參數(shù)1, 參數(shù)2...]): 大體同上區(qū)別是參數(shù)要直接傳遞給函數(shù),即逐個(gè)列舉出
- function.bind(obj): es5新增,創(chuàng)建一個(gè)函數(shù)實(shí)例,其this會(huì)綁定到傳給bind(obj)的object
//二者僅第二參數(shù)不同,
//此中this都為window,因?yàn)楹瘮?shù)sum的執(zhí)行環(huán)境是window
function sum(n1, n2) { return n1 + n2 }
//call
function callSum(n1, n2) {
return sum.call(this, n1, n2)
}
//apply()
function applySum(n1, n2) {
return sum.apply(this, arguments)
}
function applySum(n1, n2) {
return sum.call(this, [n1, n2])
}
//bind()
window.color = 'red';
var o = {color: 'blue'};
function say() {console.log(this.o)}
var newSay = say().bind(o);
newSay(); //輸出 blue 新的函數(shù)實(shí)例的執(zhí)行環(huán)境(this)已經(jīng)是傳給bind的o
5.6 基本封裝類型:每個(gè)包裝類型都映射到對(duì)應(yīng)的基本類型
- 基本類型: undefined null boolean number string Symbol(new in es6)
- 引用類型: object