亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript學(xué)習(xí)筆記 - 引用類(lèi)型

dendoink / 1071人閱讀

摘要:構(gòu)造函數(shù)本身就是一個(gè)函數(shù),只不過(guò)該函數(shù)是出于創(chuàng)建新對(duì)象的目的而定義的。使用的構(gòu)造函數(shù)是,它只為新對(duì)象定義了默認(rèn)的屬性和方法。第一種就是操作符后跟構(gòu)造函數(shù)第二種是使用對(duì)象字面量表示法。

本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。

Object類(lèi)型

Array類(lèi)型

Date類(lèi)型

RegExp類(lèi)型

Function類(lèi)型

基本包裝類(lèi)型

單體內(nèi)置對(duì)象

引用類(lèi)型的值(對(duì)象)是引用類(lèi)型的一個(gè)實(shí)例。引用類(lèi)型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。也常被稱(chēng)為類(lèi)。引用類(lèi)型有時(shí)候也被稱(chēng)為對(duì)象定義,因?yàn)樗鼈兠枋龅氖且活?lèi)對(duì)象所具有的屬性和方法。

新對(duì)象是使用new操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建的。構(gòu)造函數(shù)本身就是一個(gè)函數(shù),只不過(guò)該函數(shù)是出于創(chuàng)建新對(duì)象的目的而定義的。

var person = new Object();

這段代碼創(chuàng)建了Object引用類(lèi)型的一個(gè)新實(shí)例,然后把該實(shí)例保存在變量person中。使用的構(gòu)造函數(shù)是Object,它只為新對(duì)象定義了默認(rèn)的屬性和方法。

5.1 Object 類(lèi)型

創(chuàng)建Object實(shí)例的方式有兩種。
第一種就是new操作符后跟Object構(gòu)造函數(shù)

var person = new Object();
person.name = "Nicholas";
person.age = 29;

第二種是使用對(duì)象字面量表示法。(簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象過(guò)程)

var person = {
    name : "Nicholas",
    age : 29
}

使用對(duì)象字面量語(yǔ)法時(shí),屬性也可以使用字符串

var person = {
    "name" : "Nicholas",
    "age" : 29,
    5 : true
}
//屬性名會(huì)自動(dòng)轉(zhuǎn)換為字符串

另外,使用對(duì)象字面量語(yǔ)法時(shí),如果留空花括號(hào),則可以定義只包含默認(rèn)屬性的方法的對(duì)象

var person = {}; //與new Object()相同
person.name = "Nicholas";
person.age = 29;

在通過(guò)對(duì)象字面量定義對(duì)象時(shí),實(shí)際上不會(huì)調(diào)用Object構(gòu)造函數(shù)

對(duì)象字面量也是向函數(shù)傳遞大量可選參數(shù)的首選方式

function displayInfo(args) {
    var output = "";
    if(typeof args.name == "string"){
         output += args.name;
    }
    if(typeof args.age == "number"){
         output += args.age;
    }
    console.log(output)  //Nicholas29,Greg
}
displayInfo({
    name: "Nicholas",
    age: 29
});
displayInfo({
    name: "Greg"
});

這種傳遞參數(shù)的模式最適合需要向函數(shù)傳入大量可選參數(shù)的情形。一般來(lái)講,命名參數(shù)雖然容易處理,但是有多個(gè)可選參數(shù)的情況下就會(huì)顯示不夠靈活。最好的做法是對(duì)那些必須值使用命名參數(shù),而使用對(duì)象字面量來(lái)封裝多個(gè)可選參數(shù)。

一般訪問(wèn)對(duì)象屬性都是點(diǎn)表示法。不過(guò)也可以使用方括號(hào)來(lái)訪問(wèn)對(duì)象的屬性

console.log(person["name"]);    //"Nicholas"
console.log(person.name);    //"Nicholas"

//方括號(hào)語(yǔ)句主要優(yōu)點(diǎn)是可以通過(guò)變量來(lái)訪問(wèn)屬性
var propertyName = "name";
console.log(person[propertyName]); //"Nicholas"

通常,除非必須使用變量來(lái)訪問(wèn)屬性嗎,否則我們建議使用點(diǎn)表示法。

5.2 Array 類(lèi)型

與其他語(yǔ)言不同,ECMAScript數(shù)組的每一項(xiàng)可以保存任何類(lèi)型的數(shù)據(jù),可以用數(shù)組第一個(gè)位置保存字符串,第二位置保存數(shù)值,第三位置保存對(duì)象,以此類(lèi)推。而且ECMAScript數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動(dòng)增長(zhǎng)以容納新增數(shù)據(jù)。

創(chuàng)建數(shù)組的基本方式有兩種。第一種是使用Array構(gòu)造函數(shù):

var color = new Array();
var colors = new Array(20);        //將創(chuàng)建length值為20的數(shù)組
var colors2 = new Array("red", "blue", "green");   //創(chuàng)建一個(gè)包含3個(gè)字符串的數(shù)組
var names = new Array("Greg");  //創(chuàng)建一個(gè)包含1項(xiàng)的數(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或5項(xiàng)的數(shù)組

與對(duì)象一樣,在使用數(shù)組字面量表示法時(shí),也不會(huì)調(diào)用Array構(gòu)造函數(shù)(Firefox3及更早版本除外)

讀取數(shù)組和數(shù)組length

var colors = ["red", "blue", "green"];
var names = [];    
colors[2] = "black";    //修改第三項(xiàng)
colors[3] = "brown";    //新增第四項(xiàng)
console.log(colors[0]);   //"red"
console.log(colors.length);  //4
console.log(names.length);  //0

//數(shù)組length不是只讀的,通過(guò)設(shè)置這個(gè)屬性可以從數(shù)組的末尾移除項(xiàng)或添加新項(xiàng)
colors.length = 2;        //修改數(shù)組的長(zhǎng)度為2,數(shù)組就只有2個(gè)項(xiàng)了
console.log(colors[2]); //undefined
colors.length = 4;            
console.log(colors[3]);   //undefined;

利用length屬性也可以方便的在數(shù)組末尾添加新項(xiàng)

var colors = ["red", "blue", "green"];
colors[colors.length] = "black";
colors[colors.length] = "brown";

colors[99] = "while";
console.log(colors.length)  //100
//位置5到98實(shí)際上都是不存在的訪問(wèn)他們都將返回undefined
5.2.1 檢測(cè)數(shù)組

對(duì)于一個(gè)網(wǎng)頁(yè),或者一個(gè)全局作用域而言,使用instanceof操作符就能得到滿意的結(jié)果:

if(value instanceof Array) {
    //...
}

instanceof操作符的問(wèn)題在于,它假定只有一個(gè)全局執(zhí)行環(huán)境。如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的Array構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。

為了解決這個(gè)問(wèn)題,ECMAScript5新增了Array.isArray()方法。這個(gè)方面目的是最終確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的。

if(Array.isArray(value)){
    //...
}

注意:不建議使用instanceof可能會(huì)出現(xiàn)異常,推薦使用Array.isArray方法

5.2.2 轉(zhuǎn)換方法

所有對(duì)象都具有toLocaleString()、toString()valueOf()方法。數(shù)組調(diào)用toString()方法會(huì)返回由數(shù)組中每個(gè)值得字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串,調(diào)用valueOf()返回的還是數(shù)組。

var colors = ["red", "blue", "green"];
console.log(colors.toString());   //red,blue,green
console.log(colors.valueOf());    //返回整個(gè)數(shù)組
console.log(colors);               //返回整個(gè)數(shù)組
alert(colors.valueOf());          //red,blue,green
alert(colors);                      //red,blue,green

由于alert()要接收字符串參數(shù),所以它會(huì)在后臺(tái)調(diào)用toString()方法。

使用join()方法,則可以使用不同的分隔符來(lái)構(gòu)建這個(gè)字符串。join()方法值接收一個(gè)參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項(xiàng)的字符串。

var colors = ["red", "green", "blue"];
alert(colors.join(","));   //red,green,blue
alert(colors.join("||"));  //red||green||blue

如果數(shù)組中的某一項(xiàng)值是null或者undefined,那么該值在join()、toLocaleString()、toString()、valueOf()方法返回的結(jié)果中以空字符串表示。

5.2.3 桟方法 和 5.2.4隊(duì)列方法 桟方法

在桟中項(xiàng)的插入(叫做推入)移除(叫做彈出),只發(fā)生在一個(gè)位置——桟的頂部。ECMAScript為數(shù)組專(zhuān)門(mén)提供了push()pop()方法,以便實(shí)現(xiàn)類(lèi)似桟的行為。

push()方法可以接受任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度。而pop()方法則從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的length值,然后返回移除的項(xiàng)(值)。

隊(duì)列方法

shift()方法能夠移除數(shù)組中的第一個(gè)項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長(zhǎng)度減1。結(jié)合使用shift()push()方法,可以使用隊(duì)列一樣使用數(shù)組

ECMAScript還為數(shù)組提供了一個(gè)unshift()方法。unshift()shift()的用途相反,它能在數(shù)組前端添加任意個(gè)項(xiàng)并返回?cái)?shù)組的長(zhǎng)度。因此同時(shí)使用unshift()pop()方法,可以從相反方向來(lái)模擬隊(duì)列,即在數(shù)組前端添加項(xiàng),從數(shù)組末端移除項(xiàng)。

//push
var colors = new Array();                    //創(chuàng)建一個(gè)數(shù)組
var count = colors.push("red", "green");    //推入兩項(xiàng)(從后推入)
console.log(count);                            //2
count = colors.push("black");                //推入一項(xiàng)(從后推入)
console.log(count);                            //3
console.log(colors);                        //["red","green","black"]

//pop
var item = colors.pop();                    //取得最后一項(xiàng)
console.log(item);                          //"black"
console.log(colors.length);                 //2
console.log(colors);                        //["red","green"]

//shift
var shit = colors.shift();                    //取得第一項(xiàng)
console.log(shit);                          //"red"
console.log(colors.length);                 //1
console.log(colors);                        //["green"]

//unshift
var unshit = colors.unshift("red","blue");  //推入兩項(xiàng)(從前推入)     
console.log(unshit);                           //3
console.log(colors);                        //["red","blue","green"]
5.2.5 重排序方法

reverse()sort()可以用來(lái)對(duì)數(shù)組進(jìn)行重排序。
reverse()方法會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序。

sort()方法會(huì)調(diào)用數(shù)組中每一項(xiàng)的toString()方法,并根據(jù)返回的字符串來(lái)對(duì)整個(gè)數(shù)組進(jìn)行升序的排序,顯然大部分情況下這種默認(rèn)行為都不是我們所需要的。所以,我們可以傳入一個(gè)比較函數(shù)作為sort()方法的參數(shù),以便確定排序的順序。

var num = [0, 5, 1, 10, 15];
num.sort();
alert(num);        //結(jié)果并非是0,1,5,10,15 而是0,1,10,15,5. 原因是sort比較的是字符串

/* 因此,sort()方法可以接收一個(gè)比較函數(shù)作為參數(shù),以便我們指定哪個(gè)值位于哪個(gè)值的前面
** 比較函數(shù)接收兩個(gè)參數(shù),如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)參數(shù)之前則返回一個(gè)負(fù)數(shù),相等返回0,在之后就返回正數(shù)
*/
function compare(value1, value2){
    return value2 - value1; //降序則改為value1 - value2;
}

var num = [0, 5, 1, 10, 15];
num.sort(compare);
alert(num);//0,1,5,10,15
//若只是想反轉(zhuǎn)數(shù)組,而不用排序就用reverse()
var num = [0, 5, 1, 10, 15];
num.reverse();
alert(num);//15,10,1,5,0
5.2.6 操作方法

concat():用于拼接數(shù)組

slice():用于獲取數(shù)組中的某幾個(gè)項(xiàng)

splice():主要用途是向數(shù)組的中部插入項(xiàng)

方法一:concat()方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建個(gè)新數(shù)組,簡(jiǎn)單點(diǎn)就是創(chuàng)建個(gè)副本,然后將接受到的參數(shù)添加到這個(gè)副本的末尾, 原來(lái)的數(shù)組不會(huì)動(dòng)。

//可接收0個(gè)、1個(gè)或多個(gè)參數(shù),沒(méi)有參數(shù)就相當(dāng)于復(fù)制當(dāng)前數(shù)組,返回當(dāng)前數(shù)組的副本
//參數(shù)若是值,就直接加到副本數(shù)組的末尾。參數(shù)若是數(shù)組,則將數(shù)組中的每一項(xiàng)加到副本末尾
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yello", ["black", "brown"]);

console.log(colors);        //red,green,blue原數(shù)組不動(dòng)
console.log(colors2);        //red,green,blue,yello,black,brown

方法二:slice( )它能夠基于當(dāng)前數(shù)組中的一項(xiàng)或多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組。接收一個(gè)參數(shù)或者兩個(gè)參數(shù),即返回項(xiàng)的起始位置和結(jié)束位置。不傳則到末尾。如有2參,結(jié)束位置并不包括結(jié)束位置所在項(xiàng)(理解從0開(kāi)始)。注意 不影響原數(shù)組

var arr = ["red", "green", "blue", "yello", ""purple];
var arr2 = arr.slice(1);        //因?yàn)榈诙€(gè)參數(shù)沒(méi)有,所以從arr[1]開(kāi)始獲取后面全部項(xiàng)
var arr3 = arr.slice(1,4);        //截取arr[1]開(kāi)始到arr[4]前
console.log(arr2);                //green,blue,yellow,purple
console.log(arr3);                //green,blue,yellow

方法三:在數(shù)組方法中算是最強(qiáng)大的方法了。它有很多種用法,主要用途是向數(shù)組的中部插入項(xiàng),但使用這種方法的方式則有如下三種。

1.刪除: 可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù): 要?jiǎng)h除第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)的數(shù)目。
舉個(gè)栗子,splice(0,2); //刪除數(shù)組的前兩項(xiàng)

2.插入: 可以給指定位置插入任意數(shù)量的項(xiàng)。3+個(gè)參數(shù),起始位置,0(要?jiǎng)h除的項(xiàng)數(shù)為0項(xiàng),也就是不刪除)和要插入的項(xiàng)。如果要插入多個(gè)項(xiàng),則把項(xiàng)作為第四、第五,以致任意多個(gè)項(xiàng)。
舉個(gè)栗子: splice(2, 0, “red”, “yellow”, “green”); //在位置2依次插入red, yellow,green

3.替換 可以在指定位置刪除任意多項(xiàng),且同時(shí)刪除任意多項(xiàng)。3個(gè)參數(shù)。 (startPos, delNum, insertNum) delNum 可以和insertNum不相等
`舉個(gè)栗子: splice(2, 1, “red”, “green”);//刪除位置2的1項(xiàng),再?gòu)奈恢?插入red,green
注意: splice()方法始終返回一個(gè)從原始數(shù)組刪除的項(xiàng)的數(shù)組,若沒(méi)有刪除項(xiàng)返回即為空。
簡(jiǎn)單點(diǎn)說(shuō),就是刪了什么就返回了什么,沒(méi)刪就返回空。`

var arr = ["red", "green", "blue"];
var removed = arr.splice(0,1);            //刪除第一項(xiàng)
console.log(arr);                        //green,blue
console.log(removed);                      //red,返回的數(shù)組中只包含一項(xiàng)

removed = arr.splice(1, 0, "yellow", "orange");        //從位置1開(kāi)始插入兩項(xiàng)
console.log(arr);                                    //green,yellow,orange,blue
console.log(removed);                                  //返回的事這個(gè)空數(shù)組

removed = arr.splice(1, 1, "red", "purole");        //插入兩項(xiàng),刪除一項(xiàng)
console.log(arr);                                    //green,red,purole,orange,blue
console.log(removed);                                  //yellow,返回的數(shù)組中只包含一項(xiàng)
5.2.7 位置方法

indexOf():從數(shù)組的開(kāi)頭開(kāi)始向后查找某一項(xiàng)

lastIndexOf():從數(shù)組的末尾開(kāi)始向前查找某一項(xiàng)

兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組的索引位置,或者在沒(méi)找到的情況下返回- 1

5.2.8 迭代方法

ECMAScript5為數(shù)組定義了5個(gè)迭代方法。每個(gè)方法都接收兩個(gè)參數(shù): 要在每一項(xiàng)上運(yùn)行的函數(shù)和運(yùn)行該函數(shù)的作用域?qū)ο?可選)—-影響this的值。每一項(xiàng)運(yùn)行的函數(shù)包含三個(gè)參數(shù): 數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。以下是五個(gè)方法的作用

every(): 對(duì)數(shù)組中每一項(xiàng)運(yùn)行指定函數(shù),如果該函數(shù)每一項(xiàng)都為true,則返回true,否則false。

filter(): 對(duì)數(shù)組中每一項(xiàng)運(yùn)行指定函數(shù), 返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組(篩選出true的項(xiàng))

forEach(): 對(duì)數(shù)組中每一項(xiàng)運(yùn)行指定函數(shù), 沒(méi)有返回值。

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
以上方法都不會(huì)改變?cè)瓟?shù)組的值。

方法的理解:

every() 可以理解成 &&,全為真則真

filter() 篩選,篩選出真的項(xiàng)組成的數(shù)組,

forEach() 可以遍歷數(shù)組為數(shù)組的每個(gè)項(xiàng)添加方法

map() 映射 不管結(jié)果是什么,都返回一個(gè)由結(jié)果組成的數(shù)組,并不只是true false

some 可以理解 || 或操作,有一個(gè)為真則為真

5.2.9 歸并方法

都接受兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上都調(diào)用的函數(shù)和作為歸并基礎(chǔ)的初始值。傳個(gè)reduce和reduceRight()的函數(shù)都接受4個(gè)參數(shù):前一個(gè)值、當(dāng)前值,項(xiàng)的索引和數(shù)組對(duì)象。

reduce(): 從數(shù)組第一項(xiàng)開(kāi)始,逐個(gè)遍歷到最后一項(xiàng),可以用來(lái)數(shù)組求和

reduceRight(): 從數(shù)組最后一項(xiàng)開(kāi)始,逐個(gè)遍歷到第一項(xiàng),可以用來(lái)數(shù)組求和

這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。

//可以用來(lái)求和
var arr = [1,2,3,4,5];
var sum = arr.reduce(function(prev, cur, index, array){
    return prev + cur;
})
console.log(sum);   //15
5.5 Function類(lèi)型

函數(shù)是Function類(lèi)型的實(shí)例,函數(shù)是對(duì)象,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定。

//函數(shù)聲明語(yǔ)法定義函數(shù)
function sum (num1, num2){
    return num1 + num2
};

//函數(shù)表達(dá)式定義函數(shù)
var sum = function sum (num1, num2){
    return num1 + num2
};

//使用Function構(gòu)造函數(shù)
var sum = new Function("num1", "num2", "return num1 + num2");  //不推薦會(huì)導(dǎo)致解析兩次代碼

一個(gè)函數(shù)可能會(huì)有多個(gè)名字:

function sum (num1, num2){
    return num1 + num2
};

console.log(sum(10,10));  //20

var anotherSum = sum;        //此時(shí),anotherSum和sum的指針都指向了同一個(gè)函數(shù)
console.log(anotherSum(10,10));  //20

sum = null                    //設(shè)為null指針就沒(méi)了和函數(shù)斷絕關(guān)系
console.log(anotherSum(10,10));  //20

注意:使用不帶圓括號(hào)的函數(shù)名是訪問(wèn)函數(shù)指針,而非調(diào)用函數(shù)

5.5.1 沒(méi)有重載(深入理解)

兩個(gè)同名函數(shù),后面的函數(shù)會(huì)覆蓋前面的函數(shù)

5.5.2 函數(shù)聲明與函數(shù)表達(dá)式
alert(sum(10,10));
function sum(num1, num2){
    return num1 + num2;
}

以上代碼完全可以正常運(yùn)行,因?yàn)樵诖a開(kāi)始執(zhí)行之前,解析器就已經(jīng)通過(guò)一個(gè)名為函數(shù)聲明提升的過(guò)程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中。對(duì)代碼求值時(shí),JavaScript引擎在第一遍會(huì)聲明函數(shù)并將它們放在源代碼樹(shù)的頂部。

alert(sum(10,10));
var sum = function sum(num1, num2){
    return num1 + num2;
}

這段會(huì)錯(cuò)誤,原因是函數(shù)位于一個(gè)初始化語(yǔ)句中,而不是一個(gè)函數(shù)聲明。

5.5.3 作為值得函數(shù)

因?yàn)镋CMAScript中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來(lái)使用。也就是說(shuō),不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。

function createComparisonFunction(proertyName) {
    return function(obj1, obj2) {
        var val1 = obj1[proertyName];
        var val2 = obj2[proertyName];
        if(val1 < val2){
            return -1;
        }else if(val1 > val2){
            return 1;
        }else{
            return 0;
        }
    }
}

var data = [{
    name: "Jason",
    age: 20
}, {
    name: "Cor",
    age: 30
}];

data.sort(createComparisonFunction("name");
console.log(data[0].name);                  //Cor
data.sort(createComparisonFunction("age"));
console.log(data[0].name);                  //Jason
5.5.4 函數(shù)的內(nèi)部屬性

在函數(shù)內(nèi)部,有兩個(gè)特殊的對(duì)象:argumentsthis。

arguments的主要用途是保存函數(shù)參數(shù)但這個(gè)對(duì)象還有名叫callee的屬性、該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)。

function factorial(num) {
    if(num <= 1){
        return 1;
    }else{
        //return num * factorial(num-1)     //這個(gè)函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在一起
        return num * arguments.callee(num-1);   //解除耦合
    }
};
var trueFactorial = factorial;
factorial = function(){
    return 0;
};
console.log(trueFactorial(5))   //120
console.log(factorial(5))         //0

函數(shù)內(nèi)部的另一個(gè)特殊對(duì)象是this,this引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象——或者也可以說(shuō)this值(當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí),this對(duì)象引用的就是window)

window.color = "red";
var o = { color : "blue" };

function sayColor() {
    console.log(this.color);
}

sayColor();      //"red"

o.sayColor = sayColor;        //把sayColor函數(shù)賦給對(duì)象o
o.sayColor();    //"blue"    //this的引用是對(duì)象o

ECMAScript5也規(guī)范化了另一個(gè)函數(shù)對(duì)象的屬性:caller。這個(gè)屬性中保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,如果是在全局作用域中調(diào)用當(dāng)前函數(shù),它的值為null

function outer(){
    inner();
}

function inner(){
    console.log(arguments.callee.caller);    //為了實(shí)現(xiàn)更松散的耦合
}

outer();

注意:當(dāng)函數(shù)在嚴(yán)格模式下運(yùn)行是,訪問(wèn)arguments.callee會(huì)導(dǎo)致錯(cuò)誤。ECMAScript 5 還定義了arguments.caller屬性,但在嚴(yán)格模式下訪問(wèn)它也會(huì)導(dǎo)致錯(cuò)誤,而在非嚴(yán)格模式下這個(gè)屬性始終是undefined。定義arguments.callee屬性是為了分清arguments.caller和函數(shù)的caller屬性。以上變化都是為了加強(qiáng)這門(mén)語(yǔ)言的安全性,這樣第三方代碼就不能在相同的環(huán)境里窺視其他代碼了。
嚴(yán)格模式還有一個(gè)限制:不能為函數(shù)的caller屬性賦值,否則會(huì)導(dǎo)致錯(cuò)誤。

5.5.5 函數(shù)屬性和方法

ECMAScript的函數(shù)也是對(duì)象,因此函數(shù)也有屬性和方法。每個(gè)函數(shù)包含兩個(gè)屬性: lengthprototype。length屬性表示函數(shù)的參數(shù)數(shù)量

function jason(a, b, c) {};
console.log(jason.length); //3;

對(duì)于ECMAScript的引用類(lèi)型而言,prototype是保存它們所有實(shí)例方法的真正所在。toString()valueOf()等方法實(shí)際上都保存在prototype名下,只不過(guò)是通過(guò)各自對(duì)象的實(shí)例訪問(wèn)。在創(chuàng)建自定義引用類(lèi)型以及實(shí)現(xiàn)繼承時(shí),prototype屬性的作用是極為重要的。在ECMAScript5中,prototype屬性是不可枚舉的,因此使用for-in無(wú)法發(fā)現(xiàn)。

每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法:apply() call()。這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值。首先,apply()方法接收兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行的作用域,另一個(gè)是參數(shù)數(shù)組。其中第二個(gè)參數(shù)可以使Array的實(shí)例,也可以是arguments對(duì)象。

1.apply():
/*定義一個(gè)人類(lèi)*/
function Person(name,age)
{
    this.name=name;
    this.age=age;
}
/*定義一個(gè)學(xué)生類(lèi)*/
function Student(name,age,grade)
{
    Person.apply(this,arguments);
    this.grade=grade;
}
//創(chuàng)建一個(gè)學(xué)生類(lèi)
var student=new Student("qian",21,"一年級(jí)");
//測(cè)試
alert("name:"+student.name+"
"+"age:"+student.age+"
"+"grade:"+student.grade);
//大家可以看到測(cè)試結(jié)果name:qian  age:21  grade:一年級(jí)
//學(xué)生類(lèi)里面我沒(méi)有給name和age屬性賦值啊,為什么又存在這兩個(gè)屬性的值呢,這個(gè)就是apply的神奇之處.

分析:
Person.apply(this,arguments);
this:在創(chuàng)建對(duì)象在這個(gè)時(shí)候代表的是student
arguments:是一個(gè)數(shù)組,也就是["qian”,”21”,”一年級(jí)”];
通俗的說(shuō):student去執(zhí)行Person這個(gè)類(lèi)里面的內(nèi)容,在Person這個(gè)類(lèi)里面存在this.name等之類(lèi)的語(yǔ)句,這樣就將屬性創(chuàng)建到了student對(duì)象里面

2.call():

call()法與apply()方法作用相同,它們的區(qū)別僅在于接受參數(shù)的方式不同。在使用call()方法時(shí),傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉出來(lái)

在上面Student函數(shù)里面可以將apply中修改成如下:

function Student(name,age,grade)
{
    Person.call(this,name,age);
    this.grade=grade;
}
//效果是一樣的
3.什么情況下用apply,什么情況下用call

在給對(duì)象參數(shù)的情況下,如果參數(shù)的形式是數(shù)組的時(shí)候,比如apply示例里面?zhèn)鬟f了參數(shù)arguments,這個(gè)參數(shù)是數(shù)組類(lèi)型,并且在調(diào)用Person的時(shí)候參數(shù)的列表是對(duì)應(yīng)一致的(也就是Person和Student的參數(shù)列表前兩位是一致的) 就可以采用 apply , 如果我的Person的參數(shù)列表是這樣的(age,name),而Student的參數(shù)列表是(name,age,grade),這樣就可以用call來(lái)實(shí)現(xiàn)了,也就是直接指定參數(shù)列表對(duì)應(yīng)值的位置(Person.call(this,age,name,grade));

4.apply的一些其他巧妙用法

細(xì)心的人可能已經(jīng)察覺(jué)到,在我調(diào)用apply方法的時(shí)候,第一個(gè)參數(shù)是對(duì)象(this), 第二個(gè)參數(shù)是一個(gè)數(shù)組集合, 在調(diào)用Person的時(shí)候,他需要的不是一個(gè)數(shù)組,但是為什么他給我一個(gè)數(shù)組我仍然可以將數(shù)組解析為一個(gè)一個(gè)的參數(shù),這個(gè)就是apply的一個(gè)巧妙的用處,可以將一個(gè)數(shù)組默認(rèn)的轉(zhuǎn)換為一個(gè)參數(shù)列表([param1,param2,param3]) 轉(zhuǎn)換為(param1,param2,param3) 這個(gè)如果讓我們用程序來(lái)實(shí)現(xiàn)將數(shù)組的每一個(gè)項(xiàng),來(lái)裝換為參數(shù)的列表,可能都得費(fèi)一會(huì)功夫,借助apply的這點(diǎn)特性,所以就有了以下高效率的方法:

Math.max 可以實(shí)現(xiàn)得到數(shù)組中最大的一項(xiàng)
因?yàn)?b>Math.max 參數(shù)里面不支持Math.max([param1,param2]) 也就是數(shù)組

但是它支持Math.max(param1,param2,param3…),所以可以根據(jù)剛才apply的那個(gè)特點(diǎn)來(lái)解決 var max=Math.max.apply(null,array),這樣輕易的可以得到一個(gè)數(shù)組中最大的一項(xiàng)(apply會(huì)將一個(gè)數(shù)組裝換為一個(gè)參數(shù)接一個(gè)參數(shù)的傳遞給方法)
這塊在調(diào)用的時(shí)候第一個(gè)參數(shù)給了一個(gè)null,這個(gè)是因?yàn)闆](méi)有對(duì)象去調(diào)用這個(gè)方法,我只需要用這個(gè)方法幫我運(yùn)算,得到返回的結(jié)果就行,.所以直接傳遞了一個(gè)null過(guò)去

var nums = [3, 2, 1, 5, 4];
var max = Math.max.apply(null, nums);
console.log(max);  //5

Math.min 可以實(shí)現(xiàn)得到數(shù)組中最小的一項(xiàng)

var nums = [3, 2, 1, 5, 4];
var min = Math.min.apply(null, nums);
console.log(min);  //1

Array.prototype.push 可以實(shí)現(xiàn)兩個(gè)數(shù)組合并
同樣push方法沒(méi)有提供push一個(gè)數(shù)組,但是它提供了push(param1,param,…paramN) 所以同樣也可以通過(guò)apply來(lái)裝換一下這個(gè)數(shù)組,即:

var nums = [1, 2, 3, 4, 5];
var nums2 = [6, 7, 8, 9];
var max = Array.prototype.push.apply(nums, nums2);
console.log(nums);  //1,2,3,4,5,6,7,8,9

也可以這樣理解nums調(diào)用了push方法,參數(shù)是通過(guò)apply將數(shù)組裝換為參數(shù)列表的集合.

通常在什么情況下,可以使用apply類(lèi)似Math.min等之類(lèi)的特殊用法:

一般在目標(biāo)函數(shù)只需要n個(gè)參數(shù)列表,而不接收一個(gè)數(shù)組的形式([param1[,param2[,…[,paramN]]]]),可以通過(guò)apply的方式巧妙地解決這個(gè)問(wèn)題!

5.bind()

ECMAScript5還定義了一個(gè)方法:bind()。這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例,其this值會(huì)被綁定到傳給bind()函數(shù)的值。

window.color = "red";
var o = { color : "blue" };

function sayColor() {
    console.log(this.color);
}
var objectSayColor = sayColor.bind(o);        
//sayColor()調(diào)用bind()并傳入對(duì)象o,并創(chuàng)建了objectSayColor函數(shù)。objectSayColor()函數(shù)的this值等于o

objectSayColor();        //blue

每個(gè)繼承的toLocaleString()toString()方法始終都返回函數(shù)的代碼。另外一個(gè)繼承的valueOf()方法同樣只返回函數(shù)代碼。

5.6 基本包裝類(lèi)型

為了便于操作基本類(lèi)型值,ECMAScript還提供了3個(gè)特殊的引用類(lèi)型:Boolean、NumberString。這些類(lèi)型與本章介紹的其他引用類(lèi)型相似,但同時(shí)也具有與各自的基本類(lèi)型相應(yīng)的特殊行為。實(shí)際上,每當(dāng)讀取一個(gè)基本類(lèi)型值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類(lèi)型的對(duì)象,從而讓我們能夠調(diào)用一些方法來(lái)操作這些數(shù)據(jù)。

var s1 = "some text";        //基本類(lèi)型值
var s2 = s1.substring(2);    //調(diào)用了s1的substring()方法,結(jié)果保存s2

基本類(lèi)型值不是對(duì)象,因而從邏輯上它們不應(yīng)該有方法(但它們確實(shí)有方法)。其實(shí),后臺(tái)已經(jīng)自動(dòng)完成了一系列的處理。當(dāng)?shù)诙写a訪問(wèn)s1時(shí),訪問(wèn)過(guò)程處于一種讀取模式,也就是要從內(nèi)存中讀取這個(gè)字符串的值。而在讀取模式訪問(wèn)字符串時(shí),后臺(tái)都會(huì)自動(dòng)完成下列處理。
(1)創(chuàng)建String類(lèi)型的一個(gè)實(shí)例;
(2)在實(shí)例上調(diào)用指定的方法;
(3)銷(xiāo)毀這個(gè)實(shí)例。
可以將以上三個(gè)步驟想象成是執(zhí)行了下列代碼。

var s1 = new String("some text");    //創(chuàng)建String類(lèi)型的一個(gè)實(shí)例;
var s2 = s1.substring(2);            //在實(shí)例上調(diào)用指定的方法;
s1 = null;                             //銷(xiāo)毀這個(gè)實(shí)例。

經(jīng)過(guò)此番處理,基本的字符串值就變得跟對(duì)象一樣了。而且,上面的三個(gè)步驟也分別適用于BooleanNumber類(lèi)型對(duì)于的布爾值和數(shù)字值。

引用類(lèi)型與基本包裝類(lèi)型的主要區(qū)別就是對(duì)象的生存期。使用new操作符創(chuàng)建的引用類(lèi)型的實(shí)例,在執(zhí)行流離開(kāi)當(dāng)前作用域之前都一直保存在內(nèi)存中。而自動(dòng)創(chuàng)建的基本包裝類(lèi)型的對(duì)象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷(xiāo)毀。這意味著我們不能在運(yùn)行時(shí)為基本類(lèi)型值添加屬性和方法。

var s1 = "some text";
s1.color = "red";
alert(s1.color);   //undefined        第二行創(chuàng)建的String對(duì)象在執(zhí)行這行時(shí)已經(jīng)被銷(xiāo)毀

對(duì)基本包裝類(lèi)型的實(shí)例調(diào)用typeof會(huì)返回"object",而且所有基本包裝類(lèi)型的對(duì)象都會(huì)被轉(zhuǎn)換為布爾值的true

Object構(gòu)造函數(shù)也會(huì)像工廠方法一樣,根據(jù)傳入值的類(lèi)型返回相應(yīng)的基本類(lèi)型包裝的實(shí)例。

var obj = new Object("some text");    //把字符串傳給Object構(gòu)造函數(shù),就會(huì)創(chuàng)建String實(shí)例;而傳入數(shù)值會(huì)得到Number的實(shí)例,傳入布爾值參數(shù)就會(huì)得到Boolean的實(shí)例。
console.log(obj instanceof String);   //true

要注意的是,使用new調(diào)用基本包裝類(lèi)型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的。例如:

var value = "25";
var number = Number(value);      //轉(zhuǎn)型函數(shù)   變量number保存的是基本類(lèi)型的值25
console.log(typeof number);   //number

var obj = new Number(value);  //構(gòu)造函數(shù)   變量obj保存的是Number的實(shí)例
console.log(typeof obj);      //object

盡管不建議顯式的創(chuàng)建基本包裝類(lèi)型的對(duì)象,但它們操作基本類(lèi)型值的能力還是相當(dāng)重要的。而每個(gè)2基本包裝類(lèi)型都提供了操作響應(yīng)值的便捷方法。

5.6.1 Boolean類(lèi)型

Boolean類(lèi)型是與布爾值對(duì)應(yīng)的引用類(lèi)型。Boolean類(lèi)型的實(shí)例重寫(xiě)了valueOf()方法,返回基本類(lèi)型值true或false;重寫(xiě)了toString()方法,返回字符串"true"和"false"。

var falseObject = new Boolean(false);
var result = falseObject && true;        //布爾表達(dá)式中的所有對(duì)象都會(huì)被轉(zhuǎn)換為true。因此表達(dá)式是true && true
console.log(result);                    //true

var falseValue = false;
result = falseValue && true;
console.log(result)                      //false

alert(typeof falseObject);                //object
alert(typeof falseValue);                 //boolean
alert(falseObject instanceof Boolean);  //true
alert(falseValue instanceof Boolean);   //false

建議永遠(yuǎn)不要使用Boolean對(duì)象

5.6.2 Number類(lèi)型

Number是與數(shù)字值對(duì)于的引用類(lèi)型。要?jiǎng)?chuàng)建Number對(duì)象,可以在調(diào)用Number構(gòu)造函數(shù)時(shí)向其中傳遞相應(yīng)的數(shù)值。

var numberObject = new Number(10);

與Boolean類(lèi)型一樣。Number類(lèi)型也重寫(xiě)了valueOf()、toLocaleString()toString()方法。重寫(xiě)后的valueOf()方法返回對(duì)象表示的基本類(lèi)型數(shù)值,另外兩個(gè)方法則返回字符串形式的數(shù)值。

Number類(lèi)型還提供了一些用于將數(shù)值格式化為字符串的方法。

toFixed()

toFixed()方法會(huì)按照知指定的小數(shù)位返回?cái)?shù)值的字符串表示:

var num = 10.005;
console.log(num.toFixed(2));  //"10.01"

能夠自動(dòng)舍入的特性,使得toFixed()方法很適合處理貨幣值。不同瀏覽器的給這方法的舍入規(guī)則可能會(huì)有所不同。

toExponential()

toExponential()方法返回以指數(shù)表示法(e表示法)表示的數(shù)值得字符串形式。toExponential()也接收一個(gè)參數(shù),該參數(shù)也是指定輸出結(jié)果中的小數(shù)位數(shù)。

var num = 10;
console.log(num.toExponential(1)); //"1.0e+1"
toPrecision()

對(duì)于一個(gè)數(shù)值來(lái)說(shuō),toPrecision()方法可能會(huì)返回固定大小(fixed)格式,也可能返回指數(shù)(exponential)的格式;具體規(guī)則是看哪種格式最合適。這個(gè)方法接收一個(gè)參數(shù),即表示數(shù)值的所有數(shù)字的位數(shù)(不包含指數(shù)部分)。

var num = 99;
console.log(num.toPrecision(1));    //"1e+2"
console.log(num.toPrecision(2));    //"99"
console.log(num.toPrecision(3));    //"99.0"

與Boolean對(duì)象雷士,Number對(duì)象也以后臺(tái)方式為數(shù)值提供了重要的功能。但與此同時(shí),我們?nèi)匀徊唤ㄗh直接實(shí)例化Number類(lèi)型,而原因與顯式創(chuàng)建Boolean對(duì)象一樣。具體來(lái)講,就是在使用typeof和instanceof操作符測(cè)試基本類(lèi)型數(shù)值與引用類(lèi)型數(shù)值時(shí),得到的結(jié)果完全不同,如下

var numberObject = new Number(10);
var numberValue = 10;
alert(typeof numberObject);               //"object"
alert(typeof numberValue);                  //"number"
alert(numberObject instanceof Number);  //true
alert(numberValue instanceof Number)    //false
5.6.3 String類(lèi)型

String類(lèi)型是字符串對(duì)象包裝類(lèi)型。可以使用String構(gòu)造函數(shù)創(chuàng)建

var stringObject = new String("hello world");

String對(duì)象的方法也可以在所有基本的字符串值中訪問(wèn)到。其中,繼承的valueOf()、toLocaleString()toString()方法,都返回對(duì)象所表示的基本字符串值。

String類(lèi)型每個(gè)實(shí)例都有一個(gè)length屬性

var stringValue = "hello world";
console.log(stringValue.length); //"11"

String類(lèi)型提供了很多方法,用于輔助完成對(duì)ECMAScript中字符串的解析和操作。

1. 字符方法

兩個(gè)用于訪問(wèn)字符串中特定字符的方法是:charAt()charCodeAt()。

var stringValue = "hello world";
console.log(stringValue.charAt(1));     //"e"   返回字符串1的位置的字符
console.log(stringValue.charCodeAt());  //"101" 返回字符串1的位置的字符編碼
console.log(stringValue[1]);               //"e"   返回字符串1的位置的字符
2. 字符串操作方法

操作字符串的方法:

concat() 用于將以或多個(gè)字符串拼接起來(lái)

var stringValue "hello ";
var result = stringValue.concat("world", "!");  可以接收多個(gè)參數(shù)
console.log(result);        //"hello world"
console.log(stringValue);    //"hello"

ECMAScript還提供了三個(gè)基于子字符串創(chuàng)建新字符串的方法:slice()、substr()substring()這三個(gè)方法都會(huì)返回被操作字符串的一個(gè)子字符串,而且也都接受一或兩個(gè)參數(shù)。第一個(gè)參數(shù)指定子字符串的開(kāi)始位置,第二個(gè)參數(shù)(在指定的情況下)表示字符串到哪結(jié)束。slice()substring()指第二個(gè)參數(shù)指定的是子字符串最后一個(gè)字符后面的位置。而substr()的第二個(gè)參數(shù)指定的則是返回的字符個(gè)數(shù)。如果沒(méi)有給這些方法傳遞第二個(gè)參數(shù),則將字符串的長(zhǎng)度作為結(jié)束位置。這三個(gè)方法不會(huì)修改字符串本身的字——只返回一個(gè)基本類(lèi)型的字符串字。

var stringValue = "hello world";
console.log(stringValue.slice(3));           //"lo world"
console.log(stringValue.substring(3));      //"lo world"
console.log(stringValue.substr(3));          //"lo world"
console.log(stringValue.slice(3, 7));          //"lo w"
console.log(stringValue.substring(3, 7));   //"lo w"
console.log(stringValue.substr(3, 7));       //"lo worl"

console.log(stringValue.slice(-3));               //"rld"           slice會(huì)將傳入的負(fù)值和字符串想家
console.log(stringValue.substring(-3));          //"hello world"    substring會(huì)把所有負(fù)值轉(zhuǎn)換為0
console.log(stringValue.substr(-3));              //"rld"           substr將負(fù)的第一個(gè)參數(shù)加上字符串的長(zhǎng)度
console.log(stringValue.slice(-3, -4));          //"lo w"        
console.log(stringValue.substring(-3, -4));       //"hel"
console.log(stringValue.substr(-3, -4));           //""            轉(zhuǎn)換為0等于包含0個(gè)字符串
3.字符串位置方法

indexOf() (從前往后)從一個(gè)字符串中搜索給定的子字符串,然后返回子字符串的位置。
- lastIndexOf() (從后往前)

4.trim()方法

ECMAScript5為所有字符串定義了trim()方法。這個(gè)方法會(huì)創(chuàng)建一個(gè)字符串的副本,刪除前置及后綴的所有空額然后返回結(jié)果

trimLeft() 刪除字符串開(kāi)頭空格

trimRight() 刪除字符串末尾空格

5.字符串大小寫(xiě)轉(zhuǎn)換方法

toLocaleUpperCase() —— 轉(zhuǎn)換大寫(xiě)

toUpperCase() —— 轉(zhuǎn)換大寫(xiě)

toLocaleLowerCase() —— 轉(zhuǎn)換小寫(xiě)

toLowerCase() —— 轉(zhuǎn)換小寫(xiě)

6.字符串的模式匹配方法

match()匹配

search()查找

replace()替換

split()分割字符串

7.localeCompare()方法

這個(gè)方法比較兩個(gè)字符串

8.fromCharCode()方法

String構(gòu)造函數(shù)本身還有一個(gè)靜態(tài)方法。這個(gè)方法接收一或多個(gè)字符編碼,然后把它轉(zhuǎn)換為字符串。

5.7 單體內(nèi)置對(duì)象

ECMA-262對(duì)內(nèi)置對(duì)象的定義是:“由ECMAScript實(shí)現(xiàn)提供的、不依賴(lài)于宿主環(huán)境的對(duì)象,這些對(duì)象在ECMAScript程序執(zhí)行之前就已經(jīng)存在了”意思就是說(shuō),開(kāi)發(fā)人員不必顯式地實(shí)例化內(nèi)置對(duì)象,因?yàn)樗鼈円呀?jīng)實(shí)例化了。前面我們已經(jīng)介紹了大多數(shù)的內(nèi)置對(duì)象,例如Object、Array和String。ECMA-262還定義了兩個(gè)單體內(nèi)置對(duì)象:Global和Math。

注:每個(gè)內(nèi)置對(duì)象(built-in object)都是原生對(duì)象(Native Object),一個(gè)內(nèi)置的構(gòu)造函數(shù)是一個(gè)內(nèi)置的對(duì)象,也是一個(gè)構(gòu)造函數(shù)。

5.7.1 Global對(duì)象

Global(全局)對(duì)象可以說(shuō)是ECMAScript中最特別的一個(gè)對(duì)象了,因?yàn)槟悴还軓氖裁唇嵌瓤?,這個(gè)對(duì)象都是不存在的。不屬于任何其他對(duì)象的屬性和方法,最終都是它的屬性和方法。所有在全局作用域定義的屬性和函數(shù),都是Global對(duì)象的屬性。諸如isNaN()、isFinite()、parseInt()以及parseFloat(),實(shí)際上全都是Global對(duì)象的方法

1.URI 編碼方法

encodeURI()——編碼

encodeURIComponent()——編碼

encodeURI()——解碼

encodeURIComponent()——解碼

2.eval()方法

Javascript 的 eval 函數(shù)可以在當(dāng)前作用域執(zhí)行一段包含 Javascript 代碼的字符串。
然而,eval 函數(shù)只有在當(dāng)前作用域中直接被調(diào)用并且被調(diào)用的函數(shù)名為 eval 才會(huì)被執(zhí)行。
eval 函數(shù)的使用應(yīng)該被避免,99.9% 使用 eval 函數(shù)所實(shí)現(xiàn)的功能都可以通過(guò)不使用 eval 函數(shù)來(lái)實(shí)現(xiàn)。

eval 函數(shù)應(yīng)該盡可能地避免使用。任何使用 eval 函數(shù)的代碼都應(yīng)該被質(zhì)疑,遠(yuǎn)離eval

3.Global 對(duì)象的屬性

特殊的值undefined、NaN以及Infinity都是Global對(duì)象的屬性。所有原生引用類(lèi)型的構(gòu)造函數(shù),象Object和Function,也都是Global對(duì)象的屬性。

4.window 對(duì)象

ECMAScript雖然沒(méi)有指出如何直接訪問(wèn)Global對(duì)象,但Web瀏覽器都是將這個(gè)全局對(duì)象作為window對(duì)象的一部分加以實(shí)現(xiàn)的。因此全局作用域中聲明的所有變量和函數(shù),就都成為了window對(duì)象的屬性。

JavaScript中的window對(duì)象除了扮演ECMAScript規(guī)定的Global對(duì)象的角色外,還承擔(dān)了很多別的任務(wù)。

另一種取得Global對(duì)象的方法:

var global = function(){
    return;
}
5.7.2 Math對(duì)象 1.Math對(duì)象的屬性

Math對(duì)象包含的屬性大都是數(shù)學(xué)計(jì)算中可能會(huì)用到的一些特殊值

2min()和max()方法

可以找到最大值max和最小值min
用于數(shù)組

var values = [1, 2, 3, 5, 4];
var max = Math.max.applu(null, values);  //5
3.舍入方法

Math.ceil() 執(zhí)行向上舍入,即它總是將數(shù)值向上舍入為最接近的整數(shù)

Math.floor() 執(zhí)行向下舍入,即它總是將數(shù)值向下舍入為最接近的整數(shù)

Math.round() 執(zhí)行標(biāo)準(zhǔn)舍入,即它總是將數(shù)值四舍五入為最接近的整數(shù)

console.log(Math.ceil(25.9));   //26     ceil(25.5)——26    ceil(25.1)——26
console.log(Math.round(25.9));  //26     round(25.5)——26   round(25.1)——25
console.log(Math.floor(25.9));  //25     floor(25.5)——25   floor(25.1)——25
4.random()方法

隨機(jī)數(shù)

值 = Math.floor(Math.random() * 可能值得總數(shù) + 第一個(gè)可能的值)

//隨機(jī)數(shù)1-10之間
var num = Math.floor(Math.random() * 10 + 1);
//2-10
var num = Math.floor(Math.random() * 9 + 2);

//計(jì)算數(shù)值
function selectFrom(lowerValue, upperValue) {
    var choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);
}
//2-10
var num = selectFrom(2, 10);

//隨機(jī)抽取
var colors = ["red", "green", "blue"];
var color = colors[selectFrom(0, colors.lenght-1)];  //0到數(shù)組的長(zhǎng)度

最后,如有錯(cuò)誤和疑惑請(qǐng)指出,多謝各位大哥

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/82694.html

相關(guān)文章

  • javascript高程3 學(xué)習(xí)筆記(二)

    摘要:的理解函數(shù)與其他語(yǔ)言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類(lèi)型比如函數(shù)的形參有兩個(gè),但是調(diào)用函數(shù)傳入的參數(shù)可以寫(xiě)一個(gè),三個(gè)或不寫(xiě)參數(shù)對(duì)應(yīng)等,解析器都可以正常解析,這是因?yàn)橹袇?shù)在內(nèi)部是以一個(gè)數(shù)組形式來(lái)表示,故而不需要關(guān)系傳入?yún)?shù) ECMAScript function的理解 ECMAScript 函數(shù)與其他語(yǔ)言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類(lèi)型...

    JerryWangSAP 評(píng)論0 收藏0
  • JS學(xué)習(xí)筆記(第4章)(變量、作用域和內(nèi)存問(wèn)題)

    摘要:具體來(lái)說(shuō)就是當(dāng)執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊和語(yǔ)句。這兩個(gè)語(yǔ)句都會(huì)在作用域鏈的前端添加一個(gè)變量對(duì)象。對(duì)來(lái)說(shuō),會(huì)將指定的對(duì)象添加到作用域鏈中。 1. 基本類(lèi)型和引用類(lèi)型的值 JavaScript變量可以用來(lái)保存兩種類(lèi)型的值:基本類(lèi)性值和引用類(lèi)性值。基本類(lèi)型值源自以下5種基本數(shù)據(jù)類(lèi)型:Undefined、Null、Boolean、Number和String?;?..

    linkin 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記 - 變量、作用域與內(nèi)存問(wèn)題

    摘要:語(yǔ)句中的塊語(yǔ)句對(duì)來(lái)說(shuō),將會(huì)指定對(duì)象添加到作用域鏈中。在嚴(yán)格模式下,初始化未經(jīng)聲明的變量會(huì)導(dǎo)致錯(cuò)誤。查詢標(biāo)識(shí)符搜索過(guò)程從作用域鏈的前端開(kāi)始,向上逐級(jí)查詢與給定名字匹配的標(biāo)識(shí)符。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。 4.1基本類(lèi)型和引用類(lèi)型的值 ECMAScript變量可能包含兩種不同數(shù)據(jù)類(lèi)型的值:基本類(lèi)型值和引用類(lèi)型值?;绢?lèi)型指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類(lèi)型值指那些可...

    lavnFan 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記

    摘要:因?yàn)榧词拱似渌拇a,也只會(huì)下載并執(zhí)行屬性內(nèi)的外部腳本文件,嵌入的額外代碼會(huì)被忽略。在腳本中,如果程序員在對(duì)某個(gè)變量賦值之前未聲明,賦值操作將自動(dòng)聲明該變量。共有中數(shù)據(jù)類(lèi)型。阻止事件冒泡火狐瀏覽器創(chuàng)建元素添加子元素刪除子元素?cái)?shù)組拼接方法 所有的web開(kāi)發(fā)都是【請(qǐng)求】+【響應(yīng)】 推薦JavaScript中使用單引號(hào)引用字符串,HTML中使用雙引號(hào),防止沖突 JavaScript代碼...

    2shou 評(píng)論0 收藏0
  • 讀書(shū)筆記:編寫(xiě)高質(zhì)量javascript的68個(gè)方法

    摘要:第條盡量少使用全局對(duì)象避免聲明全局變量盡量聲明局部變量避免對(duì)全局變量增加屬性第條始終聲明局部變量第條避免使用語(yǔ)句第條熟練使用閉包的函數(shù)值包含了比調(diào)用他們時(shí)執(zhí)行所需要的代碼還要更多的信息。那些在其所涵蓋的作用域內(nèi)跟蹤變量的函數(shù)稱(chēng)為閉包。 書(shū)還沒(méi)看完。一遍看,一遍寫(xiě)讀書(shū)筆記。 這本書(shū)的序是JavaScript之父Brendan Eich寫(xiě)的,作者是JavaScript標(biāo)準(zhǔn)化委員會(huì)專(zhuān)家。可想...

    Vicky 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記整理:對(duì)象篇

    摘要:函數(shù)式對(duì)象的一個(gè)子類(lèi)型,中的函數(shù)是一等公民內(nèi)置對(duì)象中還有一些對(duì)象子類(lèi)型,通常被稱(chēng)為內(nèi)置對(duì)象。內(nèi)容對(duì)象的內(nèi)容是由一些存儲(chǔ)在特定命名位置的任意類(lèi)型的值組成的,我們稱(chēng)之為屬性。 語(yǔ)法 對(duì)象兩種定義形式 聲明(文字)形式 構(gòu)造形式 //聲明(文字)形式 var myObj = { key: value // ... } //構(gòu)造形式 var myObj = new Ob...

    testbird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

dendoink

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<