第五章:引用類型
5.1 Object 類型
5.1 .1 創(chuàng)建 Object 實(shí)例的方式有兩種
// 第一種
var person = new Object();
person.name = "Nicholas";
person.age = 29;
// 第二種 字面量方式
var person = {
name : "Nicholas",
age : 29
};
// 在使用對(duì)象字面量語(yǔ)法時(shí),屬性名也可以使用字符串,如下面這個(gè)例子所示。
var person = {
"name" : "Nicholas",
"age” : 29,
5 : true //這里的數(shù)值屬性名會(huì)自動(dòng)轉(zhuǎn)換為字符串
};
//另外,使用對(duì)象字面量語(yǔ)法時(shí),如果留空其花括號(hào),則可以定義只包含默認(rèn)屬性和方法的對(duì)象,如下所示:
var peraon = {}://與new object()相同
person.name = "Nicholas";
person.age = 29;
5.2 Array 類型
5.2.1 創(chuàng)建數(shù)組的兩種方式
// 第一種 使用 Array 構(gòu)造函數(shù)
var colors = new Array();
var colors = new Array(20);// 創(chuàng)建 length 為 20 的數(shù)組
var colors = new Array("red", "blue", "green");//創(chuàng)建了一個(gè)包含3個(gè)字符串值的數(shù)組:
// 另外,在使用Array構(gòu)造函數(shù)時(shí)也可以省略new操作符。如下面的例子所示,省略new操作符的結(jié)果相同:
var colors = Array(3);//創(chuàng)建一個(gè)包含3項(xiàng)的數(shù)組var
names = Array("Greg");//創(chuàng)建一個(gè)包含1項(xiàng),即字符率“Greg”的數(shù)組
//第二種 使用數(shù)組字面量表示法
var colors = ["red","blue","green"];//創(chuàng)建一個(gè)包含3個(gè)字符串的數(shù)組
var names = [];//創(chuàng)建一個(gè)空數(shù)組
var values = [1,2,];//不要這樣!這樣會(huì)創(chuàng)建一個(gè)包含2或3項(xiàng)的數(shù)組var options=[,,,,,];//不要這樣!這樣會(huì)創(chuàng)建一個(gè)包含5或6項(xiàng)的數(shù)組
-
在讀取和設(shè)置數(shù)組的值時(shí),要使用方括號(hào)并提供相應(yīng)值的基于 0 的數(shù)字索引,如下所示:
var colors = ["red","blue","green"];//定義一個(gè)字符事數(shù)組 alert(colors[0]);//顯示第一項(xiàng) colors[2] = "black";//修改第三項(xiàng) colors[31 = "brown";//新增第四項(xiàng) -
數(shù)組的 length 屬性很有特點(diǎn)——它不是只讀的。因此,通過設(shè)置這個(gè)屬性,可以從數(shù)組的末尾移除項(xiàng)或向數(shù)組中添加新項(xiàng)。請(qǐng)看下面的例子:
var colors = ["red","blue","green"];//創(chuàng)建一個(gè)包含3個(gè)字符事的數(shù)組 colora.length = 2; alert(colora[2]);//undefined var colors = ["red","blue","green"];//創(chuàng)建一個(gè)包含3個(gè)字符事的數(shù)組 colora.length = 4; alert(colora[3]);//undefined // 利用1ength屬性也可以方便地在數(shù)組末尾添加新項(xiàng),如下所示: var colors = ["red","blue","green"];//創(chuàng)建一個(gè)包含3個(gè)字符事的數(shù)組 colors[colors.length] = "black";//在位置3)添加一個(gè)顏色
5.2.2 檢測(cè)數(shù)組
if(value instanceof Array){
//對(duì)數(shù)組執(zhí)行某些操作
}//若網(wǎng)頁(yè)中存在多個(gè)框架,則會(huì)出現(xiàn)問題
// ES5 新增Array.isArray()
if(Array.isArray(value)){
//對(duì)數(shù)組執(zhí)行某些操作
}
5.2.3 轉(zhuǎn)換方法
-
如前所述,所有對(duì)象都具有 toLocalestring()、tostring()和 valueof()方法。其中,調(diào)用數(shù)組的 tostring()方法會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串。而調(diào)用valueof()返回的還是數(shù)組。實(shí)際上,為了創(chuàng)建這個(gè)字符串會(huì)調(diào)用數(shù)組每一項(xiàng)的 tostring()方法。來看下面這個(gè)例子。
var colors=["red","blue","green"];//創(chuàng)建一個(gè)包含3個(gè)字符串的數(shù)組 alert(colors.tostring());//red,blue,green alert(colors.valueOf());//red,blue,green alert(colors);//red,blue,green 會(huì)在后臺(tái)調(diào)用 toString 方法 -
join 方法
var colors=["red","green","blue"]; alert(colors. join(","));//red, green, blue alert(colors. join("||"));//red||green||blue
5.2.4 棧方法
-
push 方法
-
添加至數(shù)組末尾,并返回修改后的數(shù)組長(zhǎng)度
var colors=new Array();//創(chuàng)建一個(gè)數(shù)組 var count=colors.push("red","green");//推入兩項(xiàng) alert(count);//2 count=colors.push(“black");//推入另一項(xiàng) alert(count);//3
-
-
pop 方法
-
從數(shù)組末尾刪除最后一項(xiàng),減少數(shù)組的 長(zhǎng)度,并返回移除的項(xiàng)
var item=colors.pop();//取得最后一項(xiàng) alert(item);//"black" alert(colors.length);//2
-
5.2.5 隊(duì)列方法
-
shift 方法
-
從數(shù)組前端刪除第一項(xiàng),減少數(shù)組的 長(zhǎng)度,并返回移除的項(xiàng)
var item=colors.shift();//取得第一項(xiàng) alert(item);//"red" alert(colors.length);//2
-
-
unshift 方法
-
添加至數(shù)組前端,并返回修改后的數(shù)組長(zhǎng)度
var colors=new Array();/創(chuàng)建一個(gè)數(shù)組var count=colora.unshift("red","green");//推入兩項(xiàng) alert(count);//2
-
5.2.6 重排序方法
-
reverse (反轉(zhuǎn))方法
var values=[1,2,3,4,5]; values. reverse(); alert(values);//5,4,3,2,1
-
sort(排序,種類)方法
-
即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort() 方法會(huì)調(diào)用 toString() 比較的是字符串
var values=[0,1,5,10,15]; values,sort(); alert(values);//0,1,10,15,5 //解決方法 function compare (valuel, value2) { if (valuel< value2){ return 1; } else if (value1>value2) { return-1; } else{ return 0; } } var values=[0,1,5,10,15]; values. sort(compare); alert(values);//15,10,5,1,0 //對(duì)于數(shù)值類型或者其valueof()方法會(huì)返回?cái)?shù)值類型的對(duì)象類型,可以使用一個(gè)更簡(jiǎn)單的比較函數(shù)。這個(gè)函數(shù)只要用第二個(gè)值減第一個(gè)值即可。 function compare(value1,value2){ return value2-value1; }
-
5.2.7 操作方法
-
concat 方法
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 -
slice 方法
- 接收兩個(gè)參數(shù):返回項(xiàng)的起始位置和結(jié)束位置(不包括結(jié)束位置的項(xiàng))
var colors=["red","green","blue","yellow","purple"]; var colors2=colors. slice(1); var colors3=colors. slice(1,4); alert(colors2);//green, blue, yellow, purple alert(colors3);//green, blue, yellow -
splice 方法
刪除:可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù):要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。
例如,splice(0,2)會(huì)刪除數(shù)組中的前兩項(xiàng)。插入:可以向指定位置插入任意數(shù)量的項(xiàng),只需提供3個(gè)參數(shù):起始位置、0(要?jiǎng)h除的項(xiàng)數(shù))和要插入的項(xiàng)。如果要插入多個(gè)項(xiàng),可以再傳入第四、第五,以至任意多個(gè)項(xiàng)。例如,splice(2,0,"red","green")會(huì)從當(dāng)前數(shù)組的位置2開始插入字符串“red”和“green"。
替換:可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定3個(gè)參數(shù):起始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等。例如,splice(2,1,"red",“green“)會(huì)刪除當(dāng)前數(shù)組位置2的項(xiàng),然后再?gòu)奈恢?開始插入字符串“red“和“green"。
-
splice()方法始終都會(huì)返回一個(gè)數(shù)組,該數(shù)組中包含從原始數(shù)組中刪除的項(xiàng)(如果沒有刪除任何項(xiàng),則返回一個(gè)空數(shù)組)。下面的代碼展示了上述3種使用splice()方法的方式。
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");//從位置1開始括入兩項(xiàng) alert(colors);//green,yellow,orange,blue alert(removed);//返回的是一個(gè)空數(shù)組 removed=colors.splice(1,1,"red",“purple“);//插入兩項(xiàng),測(cè)除一項(xiàng) alert(colors);//green,red,purple,orange,blue alert(removed);//yellow,返回的數(shù)組中只包含一項(xiàng)
5.2.8 位置方法
都接收兩個(gè)參數(shù),要查找的項(xiàng)和(可選的)表示查找起點(diǎn)的索引
兩個(gè)方法都返回查找的項(xiàng)在數(shù)組中的位置,沒有找到返回 -1
-
要查找的向必須嚴(yán)格相等(===)
- indexOf 方法
- 從數(shù)組的開頭(位置0)開始向后找
- lastIndexOf 方法
- 從數(shù)組的末尾開始向前找
var numbers=[1,2,3,4,5,4,3,2,1]; alert(numbers. indexof(4));//3 alert(numbers.1astIndexof(4));//5 alert(numbers. indexOf(4,4));//5 alert(numbers. lastIndexof(4,4));//3 var person={ name:"Nicholas"}; var people=[{ name:"Nicholas"}]; var morePeople=[person]; alert(people.indexOf(person));//-1 alert(morePeople. indexof(person));//0 - indexOf 方法
5.2.9 迭代方法
ES5 中定義了 5 個(gè)迭代方法,每個(gè)方法接收兩個(gè)參數(shù)
-
ECMAScript5為數(shù)組定義了5個(gè)迭代方法。每個(gè)方法都接收兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和
(可選的)運(yùn)行該函數(shù)的作用域?qū)ο蟆绊憈his的值。傳入這些方法中的函數(shù)會(huì)接收三個(gè)參數(shù):數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能會(huì)也可能不會(huì)影響方法的返回值。以下是這5個(gè)迭代方法的作用。- every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true,則返回 true。
- filter()(過濾器):對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組
- forEach():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)。這個(gè)方法沒有返回值。
- map():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
- some():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回 true,則返回 true
// // every() 和 some() var numbers = [1,2,3,4,5,4,3,2,1]; var everyResult = numbers.every(function(item, index, array){ return (item > 2); }); alert(everyResult); //false var someResult = numbers.some(function(item, index, array){ return (item > 2); }); alert(someResult); //true // filter() var numbers = [1,2,3,4,5,4,3,2,1]; var filterResult = numbers.filter(function(item, index, array){ return (item > 2); }); alert(filterResult); //[3,4,5,4,3] // map() var numbers = [1,2,3,4,5,4,3,2,1]; var mapResult = numbers.map(function(item, index, array){ return item * 2; }); alert(mapResult); //[2,4,6,8,10,8,6,4,2] // forEach() var numbers = [1,2,3,4,5,4,3,2,1]; numbers.forEach(function(item, index, array){ //執(zhí)行某些操作 });
5.2.10 歸并方法
:reduce()和 reduceRight()。這兩個(gè)方法都會(huì)迭 代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)終返回的值。
,reduce()方法從數(shù)組的第一項(xiàng)開始,逐個(gè)遍歷 到后。而 reduceRight()則從數(shù)組的后一項(xiàng)開始,向前遍歷到第一項(xiàng)。
這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值
-
給 reduce()和 reduceRight()的函數(shù)接收 4 個(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)。
// reduce() var values = [1,2,3,4,5]; var sum = values.reduce(function(prev, cur, index, array){ return prev + cur; }); alert(sum); //15 //reduceRight()的作用類似,只不過方向相反而已。來看下面這個(gè)例子。 var values = [1,2,3,4,5]; var sum = values.reduceRight(function(prev, cur, index, array){ return prev + cur; }); alert(sum); //15
5.3 Date 類型
-
創(chuàng)建一個(gè)日期對(duì)象
var now = new Date();//不傳參數(shù)默認(rèn)獲取當(dāng)前時(shí)間和日期 //在調(diào)用 Date 構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對(duì)象自動(dòng)獲得當(dāng)前日期和時(shí)間。如果想根 據(jù)特定的日期和時(shí)間創(chuàng)建日期對(duì)象,必須傳入表示該日期的毫秒數(shù) var dt = new Date("2019/9/26"); -
Date.parse() 方法
- 接收一個(gè)表示日期的字符串參數(shù),然后根據(jù)字符串返回相應(yīng)的毫秒數(shù)
// 例如,要為 2004年 5月 25日創(chuàng)建一個(gè)日期對(duì)象,可以使用下面的代碼: var someDate = new Date(Date.parse("May 25, 2004")); -
Date.UTC()方法
- 同樣也返回表示日期的毫秒數(shù),但它與 Date.parse()在構(gòu)建值時(shí)使用不同的信息
- Date.UTC()的參數(shù)分別是年份、基于 0的月份(一月是 0,二月是 1,以此類推)、月中的哪一天 (1 到 31)、小時(shí)數(shù)(0 到 23)、分鐘、秒以及毫秒數(shù)
// GMT 時(shí)間 2000 年 1 月 1 日午夜零時(shí) var y2k = new Date(Date.UTC(2000, 0)); // GMT 時(shí)間 2005 年 5 月 5 日下午 5:55:55 var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); // 如同模仿 Date.parse()一樣,Date 構(gòu)造函數(shù)也會(huì)模仿 Date.UTC(),但有一點(diǎn)明顯不同:日期 和時(shí)間都基于本地時(shí)區(qū)而非 GMT來創(chuàng)建。不過,Date 構(gòu)造函數(shù)接收的參數(shù)仍然與 Date.UTC()相同。因此,如果第一個(gè)參數(shù)是數(shù)值,Date 構(gòu)造函數(shù)就會(huì)假設(shè)該值是日期中的年份,而第二個(gè)參數(shù)是月份, 以此類推。據(jù)此,可以將前面的例子重寫如下。 // 本地時(shí)間 2000 年 1 月 1 日午夜零時(shí) var y2k = new Date(2000, 0); // 本地時(shí)間 2005 年 5 月 5 日下午 5:55:55 var allFives = new Date(2005, 4, 5, 17, 55, 55);
-
Date.now() 方法
- 返回表示調(diào)用這個(gè)方法時(shí)的日期和時(shí)間的毫秒數(shù)
//取得開始時(shí)間 var start = Date.now(); //調(diào)用函數(shù) doSomething(); //取得停止時(shí)間 var stop = Date.now(); result = stop – start; // 使用 + 操作符把 Date 對(duì)象轉(zhuǎn)成字符串也可以達(dá)到同樣的目的 //取得開始時(shí)間 var start = +new Date(); //調(diào)用函數(shù) doSomething(); //取得停止時(shí)間 var stop = +new Date(); result = stop – start;
5.3.1 Date 比較大小
- Date 類型的 valueOf()方法,則根本不返回字符串,而是返回日期的毫秒表示。因此,可以 方便使用比較操作符(小于或大于)來比較日期值。請(qǐng)看下面的例子。
var date1 = new Date(2007, 0, 1); //"January 1, 2007"
var date2 = new Date(2007, 1, 1); //"February 1, 2007"
alert(date1 < date2); //true
alert(date1 > date2); //false
5.3.2 日期格式化方法
- toDateString()——以特定于實(shí)現(xiàn)的格式顯示星期幾、月、日和年;(英文的日期)
- toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日和年; (數(shù)字格式)
- toTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū);
- toLocaleTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒;
- toUTCString()——以特定于實(shí)現(xiàn)的格式完整的 UTC日期
- 與 toLocaleString()和 toString()方法一樣,以上這些字符串格式方法的輸出也是因?yàn)g覽器 而異的,因此沒有哪一個(gè)方法能夠用來在用戶界面中顯示一致的日期信息。
5.3.3 日期/時(shí)間組件方法
| 方法 | 說明 |
|---|---|
| getFullYear() | 獲取年份 |
| getMonth() | 獲取月份(0-11) |
| getDate() | 獲取日期 |
| getHours() | 小時(shí) |
| getMinutes() | 分鐘 |
| getSeconds() | 秒 |
| getDay() | 星期(0 = 星期天) |
| valueOf | 毫秒值 |
5.4 RegExp 類型
-
創(chuàng)建正則表達(dá)式
var expression = / pattern / flags; -
3 個(gè)標(biāo)志
g : 表示全局模式,,即模式將被應(yīng)用于所有字符串,而非在發(fā)現(xiàn)第一個(gè)匹配項(xiàng)時(shí)立即 停止;
i :表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項(xiàng)時(shí)忽略模式與字符串的大小寫
m:表示多行(multiline)模式,即在到達(dá)一行文本末尾時(shí)還會(huì)繼續(xù)查找下一行中是否存在與模 式匹配的項(xiàng)
/* * 匹配字符串中所有"at"的實(shí)例 */ var pattern1 = /at/g; /* * 匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫 */ var pattern2 = /[bc]at/i; /* * 匹配所有以"at"結(jié)尾的 3 個(gè)字符的組合,不區(qū)分大小寫 */ var pattern3 = /.at/gi; -
正則表達(dá)式中的元字符包括:( [ { \ ^ $ | ) ? * + .]}
/* * 匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫 */ var pattern1 = /[bc]at/i; /* * 匹配第一個(gè)" [bc]at",不區(qū)分大小寫 */ var pattern2 = /\[bc\]at/i; /* * 匹配所有以"at"結(jié)尾的 3 個(gè)字符的組合,不區(qū)分大小寫 */ var pattern3 = /.at/gi; /* * 匹配所有".at",不區(qū)分大小寫 */ var pattern4 = /\.at/gi;
5.4.1RegExp 實(shí)例屬性
global:布爾值,表示是否設(shè)置了 g 標(biāo)志。
ignoreCase:布爾值,表示是否設(shè)置了 i 標(biāo)志。
lastIndex:整數(shù),表示開始搜索下一個(gè)匹配項(xiàng)的字符位置,從 0算起。
multiline:布爾值,表示是否設(shè)置了 m 標(biāo)志。
-
source:正則表達(dá)式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)中的字符串模式返回
var pattern1 = /\[bc\]at/i; alert(pattern1.global); //false alert(pattern1.ignoreCase); //true alert(pattern1.multiline); //false alert(pattern1.lastIndex); //0 alert(pattern1.source); //"\[bc\]at" var pattern2 = new RegExp("\\[bc\\]at", "i"); alert(pattern2.global); //false alert(pattern2.ignoreCase); //true alert(pattern2.multiline); //false alert(pattern2.lastIndex); //0 alert(pattern2.source); //"\[bc\]at"
5.4.2 RegExp 實(shí)例方法
-
exec() 方法
- exec()接受一個(gè)參數(shù),即 要應(yīng)用模式的字符串,然后返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組;或者在沒有匹配項(xiàng)的情況下返回 null
- 返回的數(shù)組雖然是 Array 的實(shí)例,但包含兩個(gè)額外的屬性:index 和 input。其中,index 表示匹配 項(xiàng)在字符串中的位置,而 input 表示應(yīng)用正則表達(dá)式的字符串。
var text = "mom and dad and baby"; var pattern = /mom( and dad( and baby)?)?/gi; var matches = pattern.exec(text); alert(matches.index); // 0 alert(matches.input); // "mom and dad and baby" alert(matches[0]); // "mom and dad and baby" alert(matches[1]); // " and dad and baby" alert(matches[2]); // " and baby"...待續(xù)
5.5 Function 類型
-
函數(shù)名是指向函數(shù)的指針
function sum(num1, num2){ return num1 + num2; } alert(sum(10,10)); //20 var anotherSum = sum; alert(anotherSum(10,10)); //20 sum = null; alert(anotherSum(10,10)); //20
5.5.1 沒有重載
5.5.2 函數(shù)聲明與函數(shù)表達(dá)式
-
解析器會(huì)先讀取函數(shù)聲明,至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真 正被解釋執(zhí)行
alert(sum(10,10)); function sum(num1, num2){ return num1 + num2; } // 正常執(zhí)行 alert(sum(10,10)); var sum = function(num1, num2){ return num1 + num2; }; // 會(huì)導(dǎo)致“unexpected identifier”(意外標(biāo)識(shí)符)錯(cuò)誤
5.5.3 作為值的函數(shù)
-
因?yàn)?ECMAScript中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來使用。
function callSomeFunction(someFunction, someArgument){ return someFunction(someArgument); } // 這個(gè)函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)應(yīng)該是一個(gè)函數(shù),第二個(gè)參數(shù)應(yīng)該是要傳遞給該函數(shù)的一個(gè)值。 然后,就可以像下面的例子一樣傳遞函數(shù)了。 function add10(num){ return num + 10; } var result1 = callSomeFunction(add10, 10); alert(result1); //20 function getGreeting(name){ return "Hello, " + name; } var result2 = callSomeFunction(getGreeting, "Nicholas"); alert(result2); //"Hello, Nicholas"
5.5.4 函數(shù)內(nèi)部屬性
-
arguments
它是一個(gè)類數(shù)組對(duì)象,包含著傳入函數(shù)中的所有參數(shù)
主要作用是保存函數(shù)參數(shù)
-
這個(gè)對(duì)象還有一個(gè)名叫 callee 的屬性,該屬性是一個(gè)指針,指向擁有這個(gè) arguments 對(duì)象的函數(shù)。
// 階乘函數(shù) function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1); } } function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1); } } var trueFactorial = factorial; factorial = function(){ return 0; }; alert(trueFactorial(5)); //120 alert(factorial(5)); //0
-
this
-
this 引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象
window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue"
-
-
ECMAScript 5也規(guī)范化了另一個(gè)函數(shù)對(duì)象的屬性:caller
-
這個(gè)屬性中保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用, 如果是在全局作用域中調(diào)用當(dāng)前函數(shù),它的值為 null。
function outer(){ inner(); } function inner(){ alert(arguments.callee.caller); } outer(); //[Function: outer]
-
5.5.5 函數(shù)屬性和方法
-
每個(gè)函數(shù)都包含兩個(gè) 屬性:length 和 prototype。其中,length 屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)
function sayName(name){ alert(name); } function sum(num1, num2){ return num1 + num2; } function sayHi(){ alert("hi"); } alert(sayName.length); //1 alert(sum.length); //2 alert(sayHi.length); //0 -
每個(gè)函數(shù)都包含兩個(gè)非繼承而來的方法:apply()和 call()。
這兩個(gè)方法的用途都是在特定的作 用域中調(diào)用函數(shù)
-
apply()方法接收兩個(gè)參數(shù):一個(gè) 是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。其中,第二個(gè)參數(shù)可以是 Array 的實(shí)例,也可以是 arguments 對(duì)象。
function sum(num1, num2){ return num1 + num2; } function callSum1(num1, num2){ return sum.apply(this, arguments); // 傳入 arguments 對(duì)象 } function callSum2(num1, num2){ return sum.apply(this, [num1, num2]); // 傳入數(shù)組 } alert(callSum1(10,10)); //20 alert(callSum2(10,10)); //20 -
call()方法與 apply()方法的作用相同,它們的區(qū)別僅在于接收參數(shù)的方式不同。
function sum(num1, num2){ return num1 + num2; } function callSum(num1, num2){ return sum.call(this, num1, num2); } alert(callSum(10,10)); //20 -
它們真正強(qiáng)大的地方是能夠擴(kuò)充函數(shù) 賴以運(yùn)行的作用域
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
5.6 基本包裝類型
Boolean、Number 和 String
-
實(shí)際上,每當(dāng)讀取一個(gè)基本類型值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象,從而讓我們 能夠調(diào)用一些方法來操作這些數(shù)據(jù)
var s1 = "some text"; var s2 = s1.substring(2); // 當(dāng)?shù)诙写a訪問 s1 時(shí),訪問過程處于一種讀取模式,也就是要 從內(nèi)存中讀取這個(gè)字符串的值。而在讀取模式中訪問字符串時(shí),后臺(tái)都會(huì)自動(dòng)完成下列處理。 // (1) 創(chuàng)建 String 類型的一個(gè)實(shí)例; // (2) 在實(shí)例上調(diào)用指定的方法; // (3) 銷毀這個(gè)實(shí)例。 可以將以上三個(gè)步驟想象成是執(zhí)行了下列 ECMAScript代碼。 var s1 = new String("some text"); var s2 = s1.substring(2); s1 = null; -
引用類型與基本包裝類型的主要區(qū)別就是對(duì)象的生存期。使用 new 操作符創(chuàng)建的引用類型的實(shí)例, 在執(zhí)行流離開當(dāng)前作用域之前都一直保存在內(nèi)存中。而自動(dòng)創(chuàng)建的基本包裝類型的對(duì)象,則只存在于一 行代碼的執(zhí)行瞬間,然后立即被銷毀。這意味著我們不能在運(yùn)行時(shí)為基本類型值添加屬性和方法
var s1 = "some text"; s1.color = "red"; alert(s1.color); //undefined
5.6.1 Boolean 類型
-
要?jiǎng)?chuàng)建 Boolean 對(duì)象,可以像下面這樣調(diào)用 Boolean 構(gòu)造函數(shù)并傳入 true 或 false 值。
var booleanObject = new Boolean(true); 建議不要使用 Boolean 對(duì)象
5.6.2 Number 類型
-
要?jiǎng)?chuàng)建 Number 對(duì)象,可以在調(diào)用 Number 構(gòu)造函數(shù)時(shí)向其 中傳遞相應(yīng)的數(shù)值
var numberObject = new Number(10); -
toFixed()方法
// 會(huì)按照指定的小數(shù)位返回?cái)?shù)值的字符串表示,例如: var num = 10; alert(num.toFixed(2)); //"10.00" // 如果數(shù)值本身包含的小數(shù)位比指定的還多,那么接近指定的大小數(shù)位的值 就會(huì)舍入 var num = 10.005; alert(num.toFixed(2)); //"10.01" toExponential()方法
// 該方法返回以指數(shù)表示法(也稱 e表示法)
// toExponential()也接收一個(gè)參數(shù),而且該參數(shù)同樣 也是指定輸出結(jié)果中的小數(shù)位數(shù)
var num = 10;
alert(num.toExponential(1)); //"1.0e+1"
-
toPrecision()方法可能會(huì)返回固定大?。╢ixed)格式,也可能返回指數(shù) (exponential)格式;具體規(guī)則是看哪種格式合適。這個(gè)方法接收一個(gè)參數(shù),即表示數(shù)值的所有數(shù)字的 位數(shù)(不包括指數(shù)部分)
var num = 99; alert(num.toPrecision(1)); //"1e+2" alert(num.toPrecision(2)); //"99" alert(num.toPrecision(3)); //"99.0"
5.6.3 String 類型
-
創(chuàng)建
var str = new String("hello world"); -
字符方法
charAt() 和 charCodeAt()
這兩個(gè)方法都接收一個(gè)參數(shù),即基于 0 的字符位置
-
charAt() 方法以單字節(jié)字符串形式返回給定位置的那個(gè)字符
var stringValue = "hello world"; alert(stringValue.charAt(1)); //"e" -
charCodeAt() 方法獲取到的是字符編碼
var stringValue = "hello world"; alert(stringValue.charCodeAt(1)); //輸出"101" -
在支持的瀏覽器中,可以使用方括號(hào)加數(shù) 字索引來訪問字符串中的特定字符
var stringValue = "hello world"; alert(stringValue[1]); //"e" -
三個(gè)基于子字符串創(chuàng)建新字符串的方法:slice()、substr()和substring()。
// 都會(huì)返回被操作字符串的一個(gè)子字符串,而且也都接受一或兩個(gè)參數(shù)。第一個(gè)參數(shù)指定子字 符串的開始位置,第二個(gè)參數(shù)(在指定的情況下)表示子字符串到哪里結(jié)束。 //,slice()和 substring()的第二個(gè)參數(shù)指定的是子字符串后一個(gè)字符后面的位置。而 substr()的第二個(gè)參數(shù)指定的則是返回的字符個(gè)數(shù) var stringValue = "hello world"; alert(stringValue.slice(3)); //"lo world" alert(stringValue.substring(3)); //"lo world" alert(stringValue.substr(3)); //"lo world" alert(stringValue.slice(3, 7)); //"lo w" alert(stringValue.substring(3,7)); //"lo w" alert(stringValue.substr(3, 7)); //"lo worl" // 傳入負(fù)值 // slice()方法會(huì)將傳 入的負(fù)值與字符串的長(zhǎng)度相加,substr()方法將負(fù)的第一個(gè)參數(shù)加上字符串的長(zhǎng)度,而將負(fù)的第二個(gè) 參數(shù)轉(zhuǎn)換為 0。后,substring()方法會(huì)把所有負(fù)值參數(shù)都轉(zhuǎn)換為 0。 var stringValue = "hello world"; alert(stringValue.slice(-3)); //"rld" alert(stringValue.substring(-3)); //"hello world" alert(stringValue.substr(-3)); //"rld" alert(stringValue.slice(3, -4)); //"lo w" alert(stringValue.substring(3, -4)); //"hel" alert(stringValue.substr(3, -4)); //""(空字符串)
-
字符串位置方法
indexOf() 和 lastIndexOf()
-
從 一個(gè)字符串中搜索給定的子字符串,然后返子字符串的位置(如果沒有找到該子字符串,則返回-1)。
var stringValue = "hello world"; alert(stringValue.indexOf("o")); //4 alert(stringValue.lastIndexOf("o")); //7 // 找出所有匹配字符串 var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; var positions = new Array(); var pos = stringValue.indexOf("e"); while(pos > -1){ positions.push(pos); pos = stringValue.indexOf("e", pos + 1); } alert(positions); //"3,24,32,35,52"
-
trim() 方法
-
該方法會(huì)創(chuàng)建一個(gè)字符串副本,刪除開頭和末尾的所有空格,然后返回結(jié)果
var stringValue = " hello world "; var trimmedStringValue = stringValue.trim(); alert(stringValue); //" hello world " alert(trimmedStringValue); //"hello world"
-
-
字符串大小寫轉(zhuǎn)換方法
toLowerCase()、toLocaleLowerCase()
-
toUpperCase()和 toLocaleUpperCase()
var stringValue = "hello world"; alert(stringValue.toLocaleUpperCase()); //"HELLO WORLD" alert(stringValue.toUpperCase()); //"HELLO WORLD" alert(stringValue.toLocaleLowerCase()); //"hello world" alert(stringValue.toLowerCase()); //"hello world"
-
字符串模式匹配方法
-
match() 方法,只接受一個(gè)參數(shù),要莫是一個(gè)正則表達(dá)式,要莫是一個(gè) RegExp 對(duì)象
var text = "cat, bat, sat, fat"; var pattern = /.at/; //與 pattern.exec(text)相同 var matches = text.match(pattern); alert(matches.index); //0 alert(matches[0]); //"cat" alert(pattern.lastIndex); //0 -
search() 方法 ,參數(shù)同上
//search()方法返回字符串中第一個(gè)匹配項(xiàng)的索引;如果沒 有找到匹配項(xiàng),則返回-1。而且,search()方法始終是從字符串開頭向后查找模式。 var text = "cat, bat, sat, fat"; var pos = text.search(/at/); alert(pos); //1 replace() 方法
- 接受兩個(gè)參數(shù):第 一個(gè)參數(shù)可以是一個(gè) RegExp 對(duì)象或者一個(gè)字符串(這個(gè)字符串不會(huì)被轉(zhuǎn)換成正則表達(dá)式),第二個(gè)參 數(shù)可以是一個(gè)字符串或者一個(gè)函數(shù)。如果第一個(gè)參數(shù)是字符串,那么只會(huì)替換第一個(gè)子字符串。要想替 換所有子字符串,唯一的辦法就是提供一個(gè)正則表達(dá)式,而且要指定全局(g)標(biāo)志,如下所示。
var text = "cat, bat, sat, fat"; var result = text.replace("at", "ond"); alert(result); //"cond, bat, sat, fat" result = text.replace(/at/g, "ond"); alert(result); //"cond, bond, sond, fond"- split()
// 基于指定的分隔符將一個(gè)字符串分割成 多個(gè)子字符串,并將結(jié)果放在一個(gè)數(shù)組中。分隔符可以是字符串,也可以是一個(gè) RegExp 對(duì)象(這個(gè)方 法不會(huì)將字符串看成正則表達(dá)式)。split()方法可以接受可選的第二個(gè)參數(shù),用于指定數(shù)組的大小, 以便確保返回的數(shù)組不會(huì)超過既定大小 var colorText = "red,blue,green,yellow"; var colors1 = colorText.split(","); //["red", "blue", "green", "yellow"] var colors2 = colorText.split(",", 2); //["red", "blue"] var colors3 = colorText.split(/[^\,]+/); //["", ",", ",", ",", ""] -
-
localeCompare() 方法
-
用來比較兩個(gè)字符串,并返回下列值中的一個(gè)
- 如果字符串在字母表中應(yīng)該排在字符串參數(shù)之前,則返回一個(gè)負(fù)數(shù)(大多數(shù)情況下是-1,具體 的值要視實(shí)現(xiàn)而定);
- 如果字符串等于字符串參數(shù),則返回 0;
- 如果字符串在字母表中應(yīng)該排在字符串參數(shù)之后,則返回一個(gè)正數(shù)(大多數(shù)情況下是 1,具體的 值同樣要視實(shí)現(xiàn)而定)。
var stringValue = "yellow"; alert(stringValue.localeCompare("brick")); //1 alert(stringValue.localeCompare("yellow")); //0 alert(stringValue.localeCompare("zoo")); //-1
-
-
fromCharCode() 方法
-
接收一或 多個(gè)字符編碼,然后將它們轉(zhuǎn)換成一個(gè)字符串。
alert(String.fromCharCode(104, 101, 108, 108, 111)); //"hello"
-
5.7 單體內(nèi)置對(duì)象
5.7.1 Global 對(duì)象
- ;所有在全局作用域中定義的屬性和函數(shù),都是 Global 對(duì)象的屬性。
- 諸如 isNaN()、isFinite()、parseInt()以及 parseFloat(),實(shí)際上全都是 Global 對(duì)象的方法