《JavaScript高級程序設計》筆記:引用類型(五)

Object類型

建立object實例方法有兩種。第一種方法使用new操做符後跟object構造函數。以下:javascript

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

第二種方法使用對象字面量表示法。以下:java

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

Array類型

檢測數組

使用instanceof操做符:ios

if(value instanceof Array){
    //對數組執行某些操做
}

ECMAScript5新增長Array.isArray()方法。這個方法的目的是最終肯定某個值究竟是不是數組,而無論它是在哪一個全局執行環境中建立的。這個方法以下:正則表達式

if(Array.isArray(value)){
     //對數組執行某些操做
}

IE9+及以上,其它主流瀏覽器兼容。express

轉換方法

toLocaleString()方法
toString()方法
valueOf()方法
join()方法segmentfault

全部對象都具備toLocaleString()、toString()、valueOf()方法。其中調用數組的toString方法會返回以數組中的每一個值的字符串形式拼接而成的一個以逗號分割的字符串。
而調用valueOf()方法返回的仍是數組。數組

var colors = ['red','blue','green'];
console.log(colors.toString());
console.log(colors.valueOf());
console.log(colors.toLocaleString());

獲得的結果如圖所示:
圖片描述瀏覽器

另外toLocaleString()方法常常會返回跟toString()和valueOf()方法相同的值。但也不是總如此。當調用數組的toLocaleString()方法時,它也會建立一個數組值的以逗號分割的字符串。而與前兩個方法惟一不一樣的是,這一次爲了取得每一項的值,調用的每一項的toLocaleString()方法,而不是toString()方法。以下面例子:數據結構

var person1 = {
    toLocaleString: function(){
        return "Nikolaos";
    },
    toString: function(){
        return "Nicholaos";
    }
}
var person2 = {
    toLocaleString: function(){
        return "Grigorios";
    },
    toString: function(){
        return "Greg";
    }
}

var person = [person1,person2];
alert(person); //Nicholaos,Greg
alert(person.toString()); //Nicholaos,Greg
alert(person.toLocaleString());//Nikolaos,Grigorios

說明:因爲alert()要接收字符串參數,因此它會在後臺調用toString()方法,獲得跟直接調用toString()方法同樣的結果。app

數組繼承的toLocaleString()、toString()、valueOf()方法,在默認狀況下都會以逗號分割的字符串的形式返回數組項。可使用join()方法,則可使用不一樣的分隔符來構建這個字符串。

join()方法

join() 方法用於把數組中的全部元素放入一個字符串。元素是經過指定的分隔符進行分隔的。返回一個字符串。

var colors = ['red','blue','green'];
console.log(colors.join(',')); //red,blue,green
console.log(colors.join('||')); //red||blue||green

棧方法(後進先出)

棧是一種LIFO(Last-In-First-Out,後進先出)的數據結構,也就是最新添加的元素最先被移除。

ArrayObj.push()方法
ArrayObj.pop()方法

ArrayObj.push():就是向數組末尾添加新的元素,返回的是數組新的長度。
ArrayObj.pop():就是向數組中刪除數組最後一個元素而且返回該元素。若是數組爲空就返回undefined。

隊列方法(先進先出)

ArrayObj.shift()
ArrayObj.unshift()

ArrayObj.shift():方法用於把數組中的第一個元素刪除,並返回第一個元素的值。
若是數組是空的,則shift() 方法不進行任何操做,返回undefined。請注意,該方法不建立新數組,而是直接修改原來的數組。該方法會改變數組的長度。

ArrayObj.unshift() :該方法可把它的參數順序添加到數組的頭部。它直接修改了數組,而不是建立一個新的數組。返回的是新數組的長度。

unshift()在IE6,IE7下,數據有添加成功,但返回值倒是undefined。

重排序方法

reverse()方法
sort()方法

reverse()方法會對反轉數組項的順序。

var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values);  //5,4,3,2,1

這裏數組的初始值及順序是一、二、三、四、5。而調用數組的reverse()方法後,其值的順序變成了五、四、三、二、1。

sort()方法按升序排列數組——即最小的值位於最前面,最大的值排在最後面。爲了實現排序,sort()方法會調用每一個數組項的toString()轉型方法,而後比較獲得字符串,以肯定如何排序。即便數組中的每一項都是數組,sort()方法比較的也是字符串,以下所示:

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values);  //0,1,10,15,5

這種排序方式在不少狀況下都不是最佳方案。所以sort()方法能夠接受一個比較函數做爲參數,以便咱們指定那個值位於那個值的前面。

比較函數接受兩個參數,若是第一個參數應該位於第二個以前則返回一個負數,若是兩個參數相等,則返回0,若是第一個參數位於第二個以後則返回一個正數。如下就是一個簡單的比較函數:

function compare(value1, value2) {
   if (value1 < value2) {
       return -1;
   } else if (value1 > value2) {
       return 1;
   } else {
       return 0;
   }
}

這個比較函數可使用於大多數數據類型,只要將其做爲參數傳遞給sort()方法便可,以下面這個例子所示:

var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //0,1,5,10,15

在將比較函數傳遞到sort()方法以後,數值仍然保持了正確的升序。固然,也能夠經過比較函數產生降序排序的結果,只要交換比較函數返回的值便可:

function compare(value1, value2) {
   if (value1 < value2) {
       return 1;
   } else if (value1 > value2) {
       return -1;
   } else {
       return 0;
   }
}
var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //15,10,5,1,0

reverse()和sort()方法會返回值是通過排序以後的數組。

對於數值類型或者其valueOf方法會返回數值類型的對象類型,可使用一個更簡單的比較函數。這個函數只要用第二個值減第一個值便可:

function compare(value1, value2) {
   return value2 - value1;
}

因爲比較函數經過返回一個小於零、等於零或大於零的值來影響排序結果,所以減法操做就能夠適當處理全部狀況。

操做方法

concat()方法
slice()方法
splice()方法

concat() 方法用於鏈接兩個或多個數組。
該方法不會改變現有的數組,而僅僅會返回被鏈接數組的一個副本。

<script type="text/javascript">
var a = [1,2,3];
document.write(a.concat(4,5));
</script>

輸出的結果:1,2,3,4,5

簡介slice()與splice()方法

slice(start,end)方法

start 必需。規定從何處開始選取。若是是負數,那麼它規定從數組尾部開始算起的位置。也就是說,-1 指最後一個元素,-2 指倒數第二個元素,以此類推。

end 可選。規定從何處結束選取。該參數是數組片段結束處的數組下標。若是沒有指定該參數,那麼切分的數組包含從 start 到數組結束的全部元素。若是這個參數是負數,那麼它規定的是從數組尾部開始算起的元素。

返回值:返回一個新的數組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。

splice() 方法用於插入、刪除或替換數組的元素
語法:arrayObject.splice(index,howmany,element1,.....,elementX)

index 必需。規定從何處添加/刪除元素。
該參數是開始插入和(或)刪除的數組元素的下標,必須是數字。

howmany 必需。規定應該刪除多少元素。必須是數字,但能夠是 "0"。
若是未規定此參數,則刪除從 index 開始到原數組結尾的全部元素。

element1 可選。規定要添加到數組的新元素。從 index 所指的下標處開始插入。
elementX 可選。可向數組添加若干元素。

返回值:若是從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的數組。

說明:splice() 方法可刪除從 index 處開始的零個或多個元素,而且用參數列表中聲明的一個或多個值來替換那些被刪除的元素。

下面簡要歸納一下slice()與splice()方法

slice(start, end); slice()方法返回從參數指定位置開始到當前數組末尾的全部項。若是有兩個參數,該方法返回起死和結束位置之間的項,但不包括結束位置的項。

var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);

console.log(colors2); // green, blue, yellow, purple
console.log(colors3); // green, blue, yellow

splice()有刪除,插入,替換的功能

刪除 - 須要兩個參數,要刪除的第一項的位置和要刪除的項數。

var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1);
console.log(colors); // greeen, blue
console.log(removed); // red

插入 - 須要三個參數:起始位置、0(要刪除的項數)和要插入的項

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,0,"yellow", "orange");
console.log(colors); // ["red", "yellow", "orange", "green", "blue"]
console.log(removed); // 返回空

替換 - 須要三個參數:起始位置、要刪除的項數和要插入的任意數量的項。

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,1,"yellow", "orange");
console.log(colors);  // ["red", "yellow", "orange", "blue"]
console.log(removed); // ["green"]

位置方法

indexOf()方法
lastIndexOf()方法

ECMAScript5爲數組實例添加了兩個位置方法:indexOf()lastIndexOf()。這兩個方法都接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。其中indexOf()方法從數組開頭(位置0)開始向後查找,lastIndexOf()方法則從數組的末尾開始向前查找。

這兩個方法都返回查找的項在數組中的位置,或者沒有查找到的狀況下返回-1。在比較第一個參數與數組中的每一項時,會使用全等操做符;也就是說要求查找的項必須嚴格相等(就像使用===同樣)。

var numbers = [1,2,3,4,5,4,3,2,1];
console.log(numbers.indexOf(4));//3
console.log(numbers.lastIndexOf(4));//5
console.log(numbers.indexOf(4,4)); //5
console.log(numbers.lastIndexOf(4,4));//3
var person = {name:'Niccholas'};
var people = [{name:'Niccholas'}];
var morePeople = [person];
console.log(people.indexOf(person));//-1
console.log(morePeople.indexOf(person)); //0

支持的瀏覽器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

迭代方法

ECMAScript5爲數組定義了5個迭代方法。每一個方法都接收兩個參數:要在每一項上運行的函數和(可選的)運行該函數的做用域對象——影響this的值。傳入這些方法的函數會接收三個參數:數組項的值、該項在數組中的位置和數組對象自己。根據使用的方法不一樣,這個函數執行後的返回值可能會也可能不會影響訪問的返回值。

every():對數組中的每一項運行給定函數,若是該函數對每一項都返回true,則返回true。

filter():對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組。

forEach():對數組中的每一項運行給定函數,這個方法沒有返回值。

map():對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。

some():對數組中的每一項運行給定函數,若是該函數對某一項返回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);
});
console.log(everyResult); //false

var someResult = numbers.some(function(item,index,array){
    return (item > 2);
});
console.log(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);
});
console.log(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);
});
console.log(mapResult);  //[2, 4, 6, 8, 10, 8, 6, 4, 2]

forEach():這個方法沒有返回值,本質上和使用for循環迭代數組同樣。

支持的瀏覽器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

縮小方法

ECMAScript5還新增了兩個縮小數組的方法。reduce()reduceRight()方法。這兩個方法都會迭代數組的全部項,而後構建一個最終返回的值。其中reduce()方法從數組中的第一項開始,逐個遍歷到最後。而reduceRight()則從數組的最後一項開始,向前遍歷到第一項。

這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選)做爲縮小基礎的初始值。傳給reduce()reduceRight()的函數接收四個參數:前一個值、當前值、項的全部、數組對象。這個函數返回的任何值都會做爲第一個參數自動傳給下一項。第一次迭代放生在數組的第二項上,所以第一個參數是數組的第一項,第二個參數是數組的第二項。

使用reduce()方法能夠執行求數組中全部值之和的操做,好比:

var values = [1,2,3,4,5];
var sum = values.reduce(function(pre,cur,index,array){
    return pre + cur;
});
console.log(sum); //15

reduceRight()方法類似,只是方法想法而已。

支持的瀏覽器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

Date類型

要建立一個日期對象,使用new操做符和Date構造函數便可:

var now = new Date();

Date.parse()方法

其中Date.parse()方法接收一個表示日期的字符串參數,而後嘗試根據這個字符串返回相應日期的毫秒數。ECMA-262沒有定義Date.parse()應該支持哪一種日期格式,所以這個方法的行爲因實現而異,並且一般是因地區而異。將地區設置爲美國的瀏覽器一般都接受下列日期格式:

"月/日/年",如6/13/2004;

"英文月名 日,年",如May 12,2004;

"英文星期幾 英文月名 日 年 時:分:秒 時區",如Tue May 25 2004 00:00:00 GMT+0800。

ISO 8601擴展格式YYYY-MM-DDTHH:mm:ss:sssZ(例如 2004-05-25T00::00:00)。只有兼容ECMAScript5的實現支持這種格式。

例如,要爲2004年5月25日建立一個日期對象,可使用下面的代碼:

//Tue May 25 2004 00:00:00 GMT+0800 (中國標準時間)
var someDate = new Date(Date.parse('May 25,2004'));

若是傳入Data.parse()的方法的字符串 不能表示日期格式,會返回NAN。實際上,若是直接將表示日期的字符串傳遞給Date構造函數,也會在後臺調用Date.parse()方法,例以下面的代碼跟前面的是等價的。

//Tue May 25 2004 00:00:00 GMT+0800 (中國標準時間)
var someDate = new Date('May 25,2004');

這行代碼將會獲得與前面一行相同的日期對象。

Date.UTC()方法

Date.UTC()一樣返回日期的毫秒數。但它與Date.parse()在構建值時使用的是不一樣的信息。Date.UTC()的參數分別表示年份、基於0的月數(一月是0,二月是1,依次類推)、月中的哪一天(1到31)、小時數(0到23)、分鐘、秒、毫秒數。在這些參數中只有前兩個參數是必須的(年和月)。若是沒有提供月中的天數,則假設天數爲1;若是省略其它參數,則通通假設爲0,以下例子:

//GMT時間2000年1月1日午夜零時
var y2k = new Date(Date.UTC(2000,0));
console.log(y2k); //Sat Jan 01 2000 08:00:00 GMT+0800 (中國標準時間)

//GMT時間2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
console.log(allFives);//Fri May 06 2005 01:55:55 GMT+0800 (中國標準時間)

說明下:Greenwich Mean Time (GMT)格林尼治標準時間英國、愛爾蘭、冰島和葡萄牙屬於該時區。這個時區與中國北京時間的時差是8個小時,也就是說比北京時間晚8個小時。

Date構造函數
Date構造函數會模仿Date.UTC(),但有一點 不一樣的是,日期和時間都是基於本地時區而非GMT來建立。不過他們的參數跟Date.UTC()的參數同樣。
例如:

//本地時間2000年1月1日午夜零時
var y2k = new Date(2000,0);
console.log(y2k); //Sat Jan 01 2000 00:00:00 GMT+0800 (中國標準時間)

//本地時間2005年5月5日下午5:55:55
var allFives = new Date(2005,4,5,17,55,55);
console.log(allFives);//Thu May 05 2005 17:55:55 GMT+0800 (中國標準時間)

Date.now()方法
ES5添加了Date.now()方法,返回表示這個方法時的日期和時間的毫秒數。這個方法簡化了使用Date對象分析代碼的工做,例如:

//取得開始時間
var start = Date.now();

//調用函數
dosomething();

//取得結束時間
var stop = Date.now(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5

function dosomething(){
    console.log('打印結果');
}

支持Date.now()方法的瀏覽器包括IE9+,FireFox3+,Safari3+,Opera10.5+和Chrome。在不支持的其它瀏覽器,使用+操做符把Date對象轉成字符串,也能夠達到相同的目的。

//取得開始時間
var start = +new Date();

//調用函數
dosomething();

//取得結束時間
var stop = +new Date(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5

function dosomething(){
    console.log('打印結果');
}

繼承的方法

與其它引用類型同樣,Date類型也重寫了toLocaleString()toString()valueOf()方法。

其中toLocaleString()toString()在顯示日期和時間沒有什麼價值;而valueOf()方法不是返回的字符串,而是返回日期的毫秒錶示。所以能夠方便使用比較操做符(大於或小於)來比較日期值。以下面的例子:

var date1 = new Date(2007,0,1);
var date2 = new Date(2007,1,1);
console.log(date1 < date2); //true
console.log(date1 > date2); //false

日期格式化方法

Date類型還有一些專門用於將日期格式化爲字符串的方法,以下:

toDateString()——以特定於實現的格式顯示星期幾、月、日和年;

toTimeString()——以特定於實現的格式顯示時、分、秒和時區;

toLocaleDateString()——以特定與地區的格式顯示星期幾、月、日和年;

toLocaleTimeString()——以特定於實現的格式顯示時、分、秒;

toUTCString()——以特定於實現的格式完整的UTC日期。

與toLocaleString()和toString()方法同樣,以上這些字符串格式的方法輸出也是因瀏覽器而異的。所以沒有哪個方法可以用來在用戶界面上顯示一致的日期信息。

日期/時間組件方法

Date() 返回當日的日期和時間。
getDate() 從 Date 對象返回一個月中的某一天 (1 ~ 31)。
getDay() 從 Date 對象返回一週中的某一天 (0 ~ 6)。
getMonth() 從 Date 對象返回月份 (0 ~ 11)。
getFullYear() 從 Date 對象以四位數字返回年份。
getYear() 請使用 getFullYear() 方法代替。
getHours() 返回 Date 對象的小時 (0 ~ 23)。
getMinutes() 返回 Date 對象的分鐘 (0 ~ 59)。
getSeconds() 返回 Date 對象的秒數 (0 ~ 59)。
getMilliseconds() 返回 Date 對象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒數。
getTimezoneOffset() 返回本地時間與格林威治標準時間 (GMT) 的分鐘差。
getUTCDate() 根據世界時從 Date 對象返回月中的一天 (1 ~ 31)。
getUTCDay() 根據世界時從 Date 對象返回週中的一天 (0 ~ 6)。
getUTCMonth() 根據世界時從 Date 對象返回月份 (0 ~ 11)。
getUTCFullYear() 根據世界時從 Date 對象返回四位數的年份。
getUTCHours() 根據世界時返回 Date 對象的小時 (0 ~ 23)。
getUTCMinutes() 根據世界時返回 Date 對象的分鐘 (0 ~ 59)。
getUTCSeconds() 根據世界時返回 Date 對象的秒鐘 (0 ~ 59)。
getUTCMilliseconds() 根據世界時返回 Date 對象的毫秒(0 ~ 999)。
setDate() 設置 Date 對象中月的某一天 (1 ~ 31)。
setMonth() 設置 Date 對象中月份 (0 ~ 11)。
setFullYear() 設置 Date 對象中的年份(四位數字)。
setYear() 請使用 setFullYear() 方法代替。
setHours() 設置 Date 對象中的小時 (0 ~ 23)。
setMinutes() 設置 Date 對象中的分鐘 (0 ~ 59)。
setSeconds() 設置 Date 對象中的秒鐘 (0 ~ 59)。
setMilliseconds() 設置 Date 對象中的毫秒 (0 ~ 999)。
setTime() 以毫秒設置 Date 對象。
setUTCDate() 根據世界時設置 Date 對象中月份的一天 (1 ~ 31)。
setUTCMonth() 根據世界時設置 Date 對象中的月份 (0 ~ 11)。
setUTCFullYear() 根據世界時設置 Date 對象中的年份(四位數字)。
setUTCHours() 根據世界時設置 Date 對象中的小時 (0 ~ 23)。
setUTCMinutes() 根據世界時設置 Date 對象中的分鐘 (0 ~ 59)。
setUTCSeconds() 根據世界時設置 Date 對象中的秒鐘 (0 ~ 59)。
setUTCMilliseconds() 根據世界時設置 Date 對象中的毫秒 (0 ~ 999)。

RegExp類型

ECMAScript經過RegExp類型支持正則表達式,以下:

var expression = /pattern/flags;

其中的模式(pattern)部分能夠是任何簡單或者複雜的正則表達式,能夠包含字符類、限定符、分組、向前查找以及反向引用。每一個正則表達式可帶有一個或者多個標註(flags),用以標明正則表達式的行爲。有三個如下標誌:

  • g:表示全局模式,即模式將被應用到全部字符串,而非在發現第一個匹配項時當即中止。
  • i:表示不區分大小寫模式。
  • m:表示多行模式,即在到達一行文本末尾時還在繼續查找下一行中是否存在於模式匹配的項。

以字面量的形式來定義正則表達式

例如:匹配第一個bat或者cat,不區分大小寫

var pattern = /[bc]at/i;

使用RegExp構造函數
它接收兩個參數:一個是要匹配的字符串模式,另外一個是可選的標誌字符串。可使用字面量定義的任何表達式,均可以使用構造函數來定義,仍是以上面的例子爲例:

var pattern = new RegExp("[bc]at","i");

注意:RegExp構造函數模式參數時字符串,因此再某些狀況下要對字符進項雙重轉義。全部元字符都必須雙重轉義,如字面量模式爲/\[bc\]at/,那麼等價的字符串爲"/\\[bc\\]at/"

例子:

var re = null,
    i;
    for(i=0; i < 10; i++){
        re = /cat/g;
        console.log(re.test("catastrophe"));
    }
    for(i=0; i < 10; i++){
        re = new RegExp("cat","g");
        console.log(re.test("catastrophe"));
    }

打印結果都爲10個true

RegExp實例方法

exec - exec接收一個參數,即要應用模式的字符串,而後返回包含第一個匹配信息的數組。

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
console.log(matches); // ["cat"]

match - match是字符串執行匹配正則表達式規則的方法,他的參數是正則表達

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches2 = text.match(pattern1);
console.log(matches2); // ["cat"]

test - test()接收一個字符串參數

var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;

if (pattern.test(text)){
    console.log("The pattern was matched"); // The pattern was matched
}

詳細解釋可查看《js學習筆記 - 正則表達式詳解》

Function類型

因爲函數名僅僅是指向函數的指針。所以函數名與包含對象指針的其它變量沒有什麼不一樣。換句話說,一個函數可能有多個名字,以下例子:

function sum(num1,num2){
return num1 + num2;
}
console.log(sum(10,10)); //20

var anotherSum = sum;
console.log(anotherSum(10,10)); //20

sum = null;
console.log(anotherSum(10,10)); //20

注意:使用不帶圓括號的函數名是訪問函數指針,而非調用函數。

沒有重載(深刻理解)

函數聲明與函數表達式

做爲值的函數

函數內部屬性

在函數內部有兩個特殊的對象:argumentsthis
arguments轉爲數組

(function() {
    var slice = Array.prototype.slice,
        aArguments = slice.apply(arguments);

        console.log(aArguments);
})(10, 20, 30);

arguments.callee

該屬性是一個指針,指向擁有這個arguments對象的函數。當函數在嚴格模式下運行時,訪問arguments.callee會致使錯誤。

this

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

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

sayColor(); // red

sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue

函數屬性和方法

length

length屬性表示函數但願接收的命名參數的個數。

function sayName(name){
    alert(name);
}

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

function sayHi(){
    alert("hi");
}

console.log(sayName.length); //1
console.log(sum.length); //2
console.log(sayHi.length); //0

prototype

在es5中prototype屬性是不可枚舉的,所以使用for-in沒法發現。

每一個函數都包含兩個非繼承而來的方法:call()apply()。他們的區別在於接收的參數方式不一樣。

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

function callSum1(num1,num2){
    return sum.apply(this,arguments);
}

function callSum2(num1, num2){
    return sum.apply(this, [num1, num2]); 
}

console.log(callSum1(10,10)); // 20
console.log(callSum2(10,10)); //20

傳遞參數並不是apply()和call()的用武之地,它們的強大之處在於擴充函數的做用域,以下例子:

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

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

sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue

es5還定義了一個方法:bind()方法,這個方法會建立一個函數的實例,其中this會被綁定到傳給bind()函數的值。

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

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

var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue

sayColor調用bind()並傳入o對象,建立了objectSayColor()函數,objectSayColor()函數的this值等於o。

所以即便是在全局做用域中調用這個函數,結果也是blue。

基本包裝類型

var value = "25";
var number = Number(value);
console.log(typeof number);
console.log(number instanceof Number);// false

var obj = new Number(value);
console.log(typeof obj);
console.log(obj instanceof Number);// true

Boolean類型

var falseObject = new Boolean(false);
var result = falseObject && true; // true  

//布爾表達式中的全部對象都會被轉換爲true, 所以falseObject對象在布爾表達式中表明的是true

console.log(result); // true

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

console.log(typeof falseObject); //object
console.log(typeof falseValue); // Boolean
console.log(falseObject instanceof Boolean); //true
console.log(falseValue instanceof Boolean); // false

Number類型

var numberObject = new Number(10);
var numberValue = 10;
console.log(typeof numberObject); // Object
console.log(typoef numberValue); // number
console.log(numberObject instanceof Number); // true
console.log(numberValue instanceof Number); // false

String類型

字符方法

charAt() charCodeAt()

charAt()方法以單字符字符串的形式返回給定位置的那個字符串。

charCodeAt()返回的是字符編碼。

var stringValue = "hello world";
console.log(stringValue.charAt(1)); // e
console.log(stringValue.charCodeAt(1)); // 101

字符串操做方法

concat()

concat()用於將一或多個字符串拼接起來。

var stringValue = "hello ";
var result = stringValue.concat("world");
console.log(result); // hello world
console.log(stringValue); // hello

slice(start, end)
end 表示字符串到哪裏結束。
若是傳入的是負數,slice()方法會將傳入的負值與字符串長度相加。

var str="Hello happy world!";
console.log(str.slice(6)); // happy world!
console.log(str.slice(6,11));// happy
console.log(str.slice(-3)); // ld!
console.log(str.slice(3, -4)); //lo happy wo

substring(start, end)
若是傳入的是負數, substring()會把全部字符參數都轉換爲0

var str="Hello happy world!";
console.log(str.substring(6)); // happy world!
console.log(str.substring(6,11));// happy
console.log(str.substring(-3)); // Hello happy world!
console.log(str.substring(3, -4)); //Hel

substr(start, length)
若是傳入的是負數,substr()方法將負的第一個參數加上字符串的長度,而將負的第二個參數轉換爲0

var str="Hello world!";
console.log(str.substr(3)); //lo world!
console.log(str.substr(3, 7)); //lo worl
console.log(str.substr(-3)); // ld!
console.log(str.substr(3, -3)); // 空字符串

字符串位置方法

indexOf() lastIndexOf()

var stringValue = "hello world";
console.log(stringValue.indexOf("o")); // 4
console.log(stringValue.lastIndexOf("o")); //7

這兩個方法均可以接收可選的第二個參數,表示從字符串中的哪一個位置開始搜索。

var stringValue = "hello world";
console.log(stringValue.indexOf("o", 6)); // 7
console.log(stringValue.lastIndexOf("o", 6)); //4

字符串的模式匹配方法

match()

var text = "cat, bat, sat, fat";
var pattern = /.at/;

var matches = text.match(pattern);
console.log(matches.index); //0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); //0

search()

var text = "cat, bat, sat, fat";
var pos = text.search(/at/);
console.log(pos); // 1

replace()

var text = "cat, bat, sat, fat";
var result = text.replace("at", "ond");
console.log(result); // cond, bat, sat, fat

var result = text.replace(/at/g, "ond");
console.log(result); // cond, bond, sond, fond

單體內置對象

Global對象

URI編碼方法
Global對象的encodeURI()和encodeURIComponent()方法能夠對URI(Uniform Resources Identifiers,通用資源標識符)進行編碼,以便發送給瀏覽器。

var url = "http://www.baidu.com/";
console.log(encodeURI(url));
console.log(encodeURIComponent(url));

encodeURI()和encodeURIComponent()方法對象的兩個方法分別是decodeURI()和decodeURIComponent()

Math對象

random()方法

Math.random()方法返回介於0和1之間一個隨機數,不包含0和1。對於某些站點來講,這個方法很是實用,由於能夠利用它來隨機顯示一些名言和新聞事件。套用下面的公式,就能夠利用Math.random()從某個整數範圍內隨機選擇一個值。

值=Math.floor(Math.random()*可能值的總數+第一個可能的值)

例如:若是想選擇一個1到10之間的數值,能夠像下面這邊編寫代碼:

var num = Math.floor(Math.random()*10+1);

function selectFrom(lowerValue,upperValue){
    var choice = upperValue - lowerValue + 1;
    return Math.floor(Math.random()*choice+lowerValue);
}

var num = selectFrom(2,10);
console.log(num);

var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length-1)];
console.log(color);
相關文章
相關標籤/搜索