引用類(lèi)型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起,將其稱(chēng)之為類(lèi)卻并不妥當(dāng),因?yàn)樗痪邆鋫鹘y(tǒng)面向?qū)ο笏С值睦酆徒涌诘然窘Y(jié)構(gòu)。
5.1 Object類(lèi)型
兩種創(chuàng)建方式
var person = new Object();
person.name="jack";
person.age=18;
var anotherPerson = {
name:"jack",
age:22
}
通過(guò)字面量定義對(duì)象時(shí)實(shí)際不會(huì)調(diào)用Object對(duì)象。
除了通過(guò)點(diǎn)語(yǔ)法,也可以使用方括號(hào)訪(fǎng)問(wèn)屬性。
alert(anotherPerson["name"]);
5.2 Array類(lèi)型
js中的數(shù)組中的每一項(xiàng)可以是任何類(lèi)型的數(shù)據(jù)。
var colors= new Array("blue","red");
var persons = new Array(3);//如果參數(shù)是一個(gè)數(shù)值,那么會(huì)創(chuàng)建給定項(xiàng)數(shù)的數(shù)組,這里創(chuàng)建了長(zhǎng)度為3的數(shù)組
數(shù)組的length屬性不是只讀的,通過(guò)設(shè)置這個(gè)屬性可以給數(shù)組的末尾添加和移除元素。如果將length屬性設(shè)置大于數(shù)組項(xiàng)數(shù)的值,則新增項(xiàng)被設(shè)為undefined。
alert(Array.isArray(persons));//檢測(cè)變量是不是Array
調(diào)用toString方法會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串。實(shí)際是調(diào)用數(shù)組每一項(xiàng)的toString方法,而toLocaleString方法實(shí)際是調(diào)用數(shù)組每一項(xiàng)的toLocaleString方法
alert(colors.toString());
join方法可以使用不同的分隔符來(lái)構(gòu)建字符串。
alert(colors.join('--'))
調(diào)用valueOf方法返回?cái)?shù)組。
棧方法
push方法接受任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度,而pop方法移除數(shù)組最后一項(xiàng),并返回該項(xiàng)。
隊(duì)列方法
shift能夠移除數(shù)組的第一個(gè)項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長(zhǎng)度減1。
unshift能夠在數(shù)組前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度并返回新數(shù)組的長(zhǎng)度。
重排序方法
reverse 反轉(zhuǎn)數(shù)組項(xiàng)的順序
sort 調(diào)用每個(gè)項(xiàng)的toString方法,得到字符串然后排序,即使每一項(xiàng)都是數(shù)值,sort比較的也是字符串。
sort方法可以接受一個(gè)比較參數(shù)。比較函數(shù)接受兩個(gè)參數(shù),如果第一個(gè)參數(shù)在前面,應(yīng)該返回負(fù)數(shù)。相等返回0,反之返回正數(shù)。
var values=[0,12,2,23,44,5];
function compare(pre,next){
return pre-next;
}
alert(values.sort(compare));
操作方法
contact方法創(chuàng)建原數(shù)組的副本,然后接收到的參數(shù)添加到這個(gè)副本的末尾,最后返回新創(chuàng)建的數(shù)組。
alert(colors.concat("green"));
slice 一個(gè)參數(shù),返回從參數(shù)指定位置開(kāi)始到數(shù)組末尾的新數(shù)組,兩個(gè)參數(shù),返回從開(kāi)始位置到結(jié)束位置之間的項(xiàng),但不包括結(jié)束位置。
var values=[0,12,2,23,44,5];
alert(values.slice(1));//12 2 23 44 5
alert(values.slice(1,3));//12 2 23
如果slice方法的參數(shù)中有一個(gè)負(fù)數(shù),則用數(shù)組長(zhǎng)度加上該數(shù)來(lái)確定位置。
splice方法
刪除,指定兩個(gè)參數(shù),要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。
插入,三個(gè)參數(shù),起始位置,0,要插入的項(xiàng)
-
替換,三個(gè)參數(shù),起始位置,要?jiǎng)h除的項(xiàng)數(shù),和要插入的任意數(shù)量的項(xiàng)。插入的項(xiàng)數(shù)和刪除的項(xiàng)數(shù)不必相等。
var values=[0,12,2,23,44,5]; values.splice(2,1,13,14);//0 12 13 14 23 44 5 alert(values);
位置方法
indexOf lastIndexOf(從后向前找)查找給定項(xiàng)在數(shù)組中的位置
還可以接受一個(gè)可選參數(shù),表示要開(kāi)始找的位置
values.splice(4,0,12);//0 12 13 14 12 23 44 5
alert(values.indexOf(12));//1
alert(values.indexOf(12,3));//4
迭代方法
- every 對(duì)數(shù)組每一項(xiàng)運(yùn)行給定方法,每一項(xiàng)都是true則返回true
- filter 對(duì)數(shù)組每一項(xiàng)運(yùn)行給定方法,返回true項(xiàng)組成的數(shù)組
- map 對(duì)數(shù)組每一項(xiàng)運(yùn)行給定方法,返回函數(shù)操作結(jié)果組成的數(shù)組
- forEach 對(duì)數(shù)組每一項(xiàng)運(yùn)行給定方法,不返回結(jié)果。
- some 對(duì)數(shù)組每一項(xiàng)運(yùn)行給定方法,有一項(xiàng)是true則返回true
歸并方法
reduce reduceRight 迭代數(shù)組的所有項(xiàng),構(gòu)建一個(gè)最終的返回值。reduce 從頭開(kāi)始 reduceRight從數(shù)組末尾開(kāi)始。
這兩個(gè)方法接受兩個(gè)兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù),和作為歸并基礎(chǔ)的初始值。調(diào)用的函數(shù)接受4個(gè)參數(shù):前一個(gè)值,當(dāng)前值,項(xiàng)的索引和數(shù)組對(duì)象。這個(gè)函數(shù)的返回值會(huì)作為第一個(gè)參數(shù)傳給下一項(xiàng)。
var numbers=[1,2,3,4,5];
var sum=numbers.reduce(function(pre,cur,index,array){
return pre+=cur;
})
alert(sum);
5.3 Date類(lèi)型
var now= new Date();
alert(now);//Mon Aug 01 2016 11:36:11 GMT+0800 (CST)
var someDate=new Date("8/1/2016");
alert(someDate);//Mon Aug 01 2016 11:39:23 GMT+0800 (CST)
var date2 = new Date(Date.UTC(2016,7,1,11,41));
alert(date2);
5.4 RegExp類(lèi)型
var expressions = /pattern/flags;
pattern表示正則表達(dá)式,flags標(biāo)志正則表達(dá)式的行為。
g 全局模式,應(yīng)用與所有字符串,而非發(fā)現(xiàn)第一個(gè)匹配項(xiàng)立即停止。
i 不區(qū)分大小寫(xiě)模式
-
m 多行模式 到達(dá)一行末尾時(shí)還會(huì)繼續(xù)查找下一行。
還可以使用RegExp構(gòu)造函數(shù):var pattern3=/.at/gi; var pattern2= new RegExp(".at");
5中規(guī)定,字面量和構(gòu)造函數(shù)一樣,每次都創(chuàng)建新的RegExp實(shí)例。
exec()接受要應(yīng)用的模式的字符串,返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組;沒(méi)有返回null。數(shù)組里還有兩個(gè)額外的屬性:index和input index表示匹配項(xiàng)在字符串的位置,input表示應(yīng)用正則表達(dá)式的字符串。
exex()即使設(shè)置了g,每次也只會(huì)返回一個(gè)匹配項(xiàng)。
test() 有匹配返回true。
5.5 Function
函數(shù)實(shí)際上是對(duì)象,每個(gè)函數(shù)都是Function類(lèi)型的實(shí)例
兩種方式
function sum(number1,number2){
return number1+number2;
}//函數(shù)聲明 推薦
var sum=function(number1,number2){
return number1+number2;
}//函數(shù)表達(dá)式
解析器在向執(zhí)行環(huán)境加載數(shù)據(jù)時(shí),會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可訪(fǎng)問(wèn)。函數(shù)表達(dá)式則必須等到解析器執(zhí)行到它所在的行,才會(huì)真正被執(zhí)行。
即使聲明函數(shù)的代碼在調(diào)用之后,它也能被提升到頂部。
函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象,arguments和this,arguments有一個(gè)callee的屬性,指向擁有這個(gè)arguments的函數(shù)。
function factorial(num){
if(num<1){
return 1
}else{
return num*arguments.callee(num-1);
}
}
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。
caller保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用。
對(duì)于引用類(lèi)型而言,prototype是保存它們所有實(shí)例方法的真正所在。
每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法,apply和call。
apply接收兩個(gè)參數(shù),一是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。call類(lèi)似,第二個(gè)參數(shù)數(shù)組里的參數(shù)必須逐個(gè)列舉出來(lái)。
apply和call真正強(qiáng)大的方法是能夠擴(kuò)充函數(shù)賴(lài)以運(yùn)行的作用域。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//red
sayColor.apply(o)//blue
bind 創(chuàng)建一個(gè)函數(shù)實(shí)例,其this值會(huì)被綁定到bind的參數(shù)。
5.6 基本包裝類(lèi)型
Boolean Number String
每當(dāng)讀取一個(gè)基本類(lèi)型的值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類(lèi)型的對(duì)象。
var s1="hello";
var s2=s1.toLocaleUpperCase();//創(chuàng)建實(shí)例 調(diào)用實(shí)例方法 銷(xiāo)毀實(shí)例
var num=10;
alert(num.toFixed(2));//10.00 按照指定的小數(shù)位返回?cái)?shù)值的字符串表示
String
字符方法
alert(name.charAt(1));//a
alert(name.charCodeAt(1));//97
alert(name[1]);//a
字符串操作方法
slice substring substr 這三個(gè)方法都會(huì)返回一個(gè)新的字符串,第一個(gè)參數(shù)代表起始位置,第二個(gè)參數(shù)不傳默認(rèn)到結(jié)尾,傳的話(huà)slice和substring是結(jié)束位置的后一個(gè)位置,substr是返回的字符串長(zhǎng)度。
alert(name.slice(2));//jackson
alert(name.substring(2));//jackson
alert(name.substr(2));//jackson
alert(name.slice(2,3));//c
alert(name.substring(2,3));//c
alert(name.substr(2,3));//cks
位置方法
alert(name.indexOf("k"));//3
alert(name.lastIndexOf("c"))//2
alert(name.indexOf("x"))//-1 找不到返回-1
trim 創(chuàng)建個(gè)新串,刪除前面和后面的空格。
大小寫(xiě)轉(zhuǎn)換
toLocaleUpperCase toLocaleLowerCase
alert(name.toLocaleUpperCase())//JACKSON
字符串的模式匹配
var matches=content.match(pattern);
alert(matches.index);
alert(matches[0]);
alert(content.search(matches));//返回字符串中第一個(gè)匹配項(xiàng)的索引,沒(méi)有返回-1
替換字符串
replace方法 第一個(gè)參數(shù)是reg對(duì)象或者字符串,第二個(gè)參數(shù)是一個(gè)字符串或者函數(shù),如果第一個(gè)參數(shù)是字符串,只會(huì)替換第一個(gè)子字符串,如果想替換所有,就要提供正則表達(dá)式,并且指定g。
alert(content.replace("at","ad"));//cad,bat,sat,fat
alert(content.replace(/at/g,"ad"));//cad,bad,sad,fad
5.7 單體內(nèi)置對(duì)象
Global 不屬于任何其他對(duì)象的屬性和方法,最終都是它的屬性和方法。所有在全局作用域中定義的屬性和函數(shù),都是Global對(duì)象的屬性。
encodeURI encodeURIComponent 對(duì)URI進(jìn)行編碼以便發(fā)送給瀏覽器。
eval方法接受一個(gè)字符串,即要執(zhí)行的js代碼。
Math對(duì)象
var max=Math.max(3,71,22,14);
var max=Math.min(3,71,22,14);
var values=[22,1,44,5];
var max=Math.max.apply(Math,values);
alert(Math.ceil(25.9));//向上
alert(Math.round(25.9));//四舍五入
alert(Math.floor(25.1));//向下
值=Math.floor(Math.random()*可能值的總數(shù)+第一個(gè)可能的值)