引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例。在ECMScript中,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起,旦它不具備傳統(tǒng)的面向?qū)ο笳Z言所支持的類和接口等基本結(jié)構(gòu)。引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗麄兠枋龅氖且活悓?duì)象所具有的屬性和方法。
5.1 Object類型
創(chuàng)建Object實(shí)例的方式有兩種。
第一種使用new操作符和Object()構(gòu)造函數(shù)。
<pre>
var person = new Object();
person.name = "zhang";
person.age = "22";
</pre>
第二種使用對(duì)象字面量的表示法。
<pre>
var person = {
name:"zhang",
age:"22"
};
</pre>
使用方括號(hào)表示法訪問對(duì)象的屬性。方括號(hào)語法的主要優(yōu)點(diǎn)是可以通過變量來訪問屬性,例如:
<pre>
var propertyName = "name";
alert(person[propertyName]);
</pre>
如果屬性名中包含導(dǎo)致語法錯(cuò)誤的字符,或者屬性名使用的是關(guān)鍵字或保留字,也可以使用方括號(hào)表示法。
通常,除非必須使用變量來訪問屬性,否則我們建議使用點(diǎn)表示法。
5.2 Array類型
創(chuàng)建數(shù)組的方法有兩種。第一種使用構(gòu)造函數(shù)。
<pre>
var colors = new Array();
</pre>
第二種是使用數(shù)組字面量表示法。
<pre>
var colors = ["red","blue"];
var colors1 = [1,2,];//不要這樣創(chuàng)建,這樣會(huì)創(chuàng)建一個(gè)包含2或3項(xiàng)的數(shù)組。
</pre>
數(shù)組的length屬性很有特點(diǎn),它不是只讀的,通過設(shè)置這個(gè)屬性,可以從數(shù)組的末尾移除項(xiàng)或向數(shù)組中添加新項(xiàng)。
<pre>
var colors = ["red","blue","green"];
colors.length = 2;
alert(clolrs[2]);//undefined
colors[colors.length] = "black";//在位置2添加了一種顏色
</pre>
轉(zhuǎn)換方法
數(shù)組的toString()方法會(huì)返回有數(shù)組的每個(gè)值得字符串形式憑借而成的一個(gè)一逗號(hào)分隔的字符串。為了創(chuàng)建這個(gè)字符串會(huì)調(diào)用數(shù)組每一項(xiàng)的toString()方法
調(diào)用valueOf()返回的還是數(shù)組。
<pre>
var person1 = {
toString:function(){
return "tostring1";
},
valueOf:function(){
return "valueOf1";
},
toLocaleString:function(){
return "toLocaleString1";
}
}
var person2 = {
toString:function(){
return "tostring2";
},
valueOf:function(){
return "valueOf1";
},
toLocaleString:function(){
return "toLocaleString1";
}
}
var colors = [person1,person2];
console.log(colors.toString());
console.log(colors.toLocaleString());
console.log(colors);
console.log(colors.valueOf());
console.log(colors.join("||"));
</pre>
join()方法只接收一個(gè)參數(shù),即用作分隔胡的字符串,然后返回包含所有數(shù)組項(xiàng)的字符串。
棧方法
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。
push()方法可以接收任意數(shù)量的參數(shù),吧他們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長度,pop()方法則從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的length值,然后返回移除的項(xiàng)。
隊(duì)列方法
隊(duì)列數(shù)據(jù)結(jié)構(gòu)的訪問規(guī)則是先進(jìn)先出。
push()方法和shift()方法,移除隊(duì)列的第一項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長度減1.
反隊(duì)列方法
和隊(duì)列方法相反的規(guī)則,數(shù)組的前端添加項(xiàng),從數(shù)組的末端移除項(xiàng)
<pre>
var colors = new Array();
var count = colors.unshift("red","green");
alert(count);//2
var item = colors.pop();
alert(item);//"green"
alert(colors.length);//1
</pre>
重排序方法
reverse()和sort()方法;sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)型方法,然后比較得到的字符串,以確定如何排序。
關(guān)于sort()函數(shù)的一些資料如下:
http://www.cnblogs.com/520yang/articles/4382688.html
操作方法
concat()方法
<pre>
var colors = ["red","green","blue"];
var colors2 = colors.concat("yellow",["black","brown"]);
alert(colors);//red,green,blue
alert(colors2);//red,green,blue,yellow,black,brown
</pre>
slice()方法
<pre>
var num = [1,2,3,4,5];
var num1 = num.slice(1);
var num2 = num.slice(1,4);
alert(num1);//2,3,4,5
alert(num2);//2,3,4
console.log(num1);//[2,3,4,5]
</pre>
splice()方法始終返回一個(gè)數(shù)組,該數(shù)組中包含從原始數(shù)組中刪除的項(xiàng)(如果沒有刪除任何項(xiàng),則返回一個(gè)空數(shù)組)
<pre>
var colors = ["red","green","blue"];
var removed = colors.splice(0,1);//刪除第一項(xiàng)
alert(colors);//green,blue
alert(removed);//red,返回的數(shù)組中只包含一項(xiàng)
removed = colors.splice(1,0,"yellow","orange");
alert(colors);//green,yellow,orange,blue
alert(removed);//返回的是一個(gè)空數(shù)組
removed = colors.splice(1,1,"red","purple");
alert(colors);//green,red,purple,orange,blue
alert(removed);//yellow,返回的數(shù)組中只包含一項(xiàng)
</pre>
位置方法
indexOf()和lastIndexOf(),這兩個(gè)方法都接受兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找七點(diǎn)位置的索引。這兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組中的位置,或者在沒找到的情況下返回-1.要求查找的項(xiàng)必須嚴(yán)格相等。
迭代方法
五個(gè)迭代方法,每個(gè)方法都接受兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和(可選的)運(yùn)行該函數(shù)的作用域的對(duì)象——影響this的值;
傳入這些方法中的函數(shù)會(huì)接受三個(gè)參數(shù):數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身,根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能會(huì)也可能不會(huì)影響方法的返回值。
every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = number.every(function(item,index,array){
return (item>2);
});
alert(result);//false
</pre>
some()方法只要傳入的函數(shù)對(duì)數(shù)組中的某一項(xiàng)返回true,就會(huì)返回true。
filter()函數(shù)
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.filter(function(item,index,array){
return (item>2);
});
alert(result);//[3,4,5,4,3]
</pre>
map()函數(shù),返回一個(gè)數(shù)組,而這個(gè)數(shù)組的每一項(xiàng)都是在原始數(shù)組中的對(duì)應(yīng)項(xiàng)上運(yùn)行傳入函數(shù)的結(jié)果。例如,可以給數(shù)組中的每一項(xiàng)乘以2,然后返回這些乘積組成的數(shù)組。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.map(function(item,index,array){
return item * 2;
});
alert(result);//[2,4,6,8,10,8,6,4,2]
</pre>
forEach()方法,對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù)。這個(gè)方法沒有返回值,本質(zhì)和使用for循環(huán)迭代數(shù)組一樣。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item,index,array){
//執(zhí)行某些操作
});
</pre>
歸并方法
reduce()和reduceRight().這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。這兩個(gè)方法都接受兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值。傳給的函數(shù)接收四個(gè)參數(shù):前一個(gè)值、當(dāng)前值、項(xiàng)的索引和數(shù)組對(duì)象。這個(gè)函數(shù)返回的任何職都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)是數(shù)組的第二項(xiàng)。
<pre>
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev + cur;
});
alert(sum);//15
</pre>
5.5 Function類型
函數(shù)實(shí)際上是對(duì)象。每個(gè)函數(shù)都是Function類型的實(shí)例,而且都與其他引用類型一樣具有屬性和方法。由于函數(shù)是對(duì)象,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定。
定義函數(shù)的方法:
<pre>
function sum(num1,num2){
rerurn num1 + num2;
};
</pre>
<pre>
var sum = function(num1,num2){
return num1 + num2;
};
</pre>
<pre>
var sum = new Function("num1","num2","return num1 + num2");//不推薦
</pre>
5.5.1 沒有重載
5.5.2 函數(shù)聲明和函數(shù)表達(dá)式
解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到他所在的代碼行,才會(huì)被真正解釋執(zhí)行。
<pre>
alert(sum(10,10));//發(fā)生錯(cuò)誤,“unexpected identifier”(意外標(biāo)識(shí)符)錯(cuò)誤
var sum = function(num1,num2){
return num1 + num2;
};
</pre>
5.5.3 作為值的函數(shù)
不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。
<pre>
function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
};
function add(num){
return num + 1;
};
var result = callSomeFunction(add,10);
alert(result);//20
</pre>
可以從一個(gè)函數(shù)中返回另一個(gè)函數(shù),而且這也是很有用的一種技術(shù)。
<pre>
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
}
}
</pre>
5.5.4 函數(shù)內(nèi)部屬性
5.5.5 函數(shù)屬性和方法
每個(gè)函數(shù)有兩個(gè)屬性,length和prototype。其中,length屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)
<pre>
function sayName(name){
alert(name);
}
alert(sayName.length);//1
</pre>
prototype屬性是不可枚舉的,因此使用for-in無法發(fā)現(xiàn)。
每個(gè)函數(shù)都包含兩個(gè)非繼承而來的方法:apply()和call()。
<pre>
function sum(num1,num2){
return num1 + num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum1(10,10));//20
alert(callSum2(10,10));//20
</pre>
傳遞參數(shù)并非apply()和call()真正的用武之地,他們真正強(qiáng)大的地方是能夠擴(kuò)充函數(shù)賴與運(yùn)行的作用域。
<pre>
window.color = "red";
var o ={
color:"blue"
};
function sayColor(){
alert(this.color);
}
sayColor();//red
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue
</pre>
使用call()或apply()來擴(kuò)充作用域的好處,就是對(duì)象不需要與方法有任何耦合關(guān)系。
ECMAScript 5還定義了一個(gè)方法:bind()。這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例,其this值會(huì)被綁定到傳給bind()函數(shù)的值。
<pre>
window.color = "red";
var o = {
color:"blue"
};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue
</pre>