摘要:元素是通過指定的分隔符進行分隔的。返回值如果從中刪除了元素,則返回的是含有被刪除的元素的數組。根據使用的方法不同,這個函數執行后的返回值可能會也可能不會影響訪問的返回值。對數組中的每一項運行給定函數,返回該函數會返回的項組成的數組。
Object類型
創建object實例方法有兩種。第一種方法使用new操作符后跟object構造函數。如下:
var person=new Object(); person.name="Nicholas"; person.age=29;
第二種方法使用對象字面量表示法。如下:
var person={ name:"Nicholas", age:29 }Array類型 檢測數組
使用instanceof操作符:
if(value instanceof Array){ //對數組執行某些操作 }
ECMAScript5新增加Array.isArray()方法。這個方法的目的是最終確定某個值到底是不是數組,而不管它是在哪個全局執行環境中創建的。這個方法如下:
if(Array.isArray(value)){ //對數組執行某些操作 }
IE9+及以上,其它主流瀏覽器兼容。
轉換方法toLocaleString()方法
toString()方法
valueOf()方法
join()方法
所有對象都具有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()方法一樣的結果。
數組繼承的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
這里數組的初始值及順序是1、2、3、4、5。而調用數組的reverse()方法后,其值的順序變成了5、4、3、2、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() 方法用于連接兩個或多個數組。
該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。
輸出的結果: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)。
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
沒有重載(深入理解) 函數聲明與函數表達式 作為值的函數 函數內部屬性注意:使用不帶圓括號的函數名是訪問函數指針,而非調用函數。
在函數內部有兩個特殊的對象:arguments和this。
把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);// trueBoolean類型
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); // falseNumber類型
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); // falseString類型 字符方法
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);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107006.html
摘要:三種使用構造函數創建對象的方法和的作用都是在某個特殊對象的作用域中調用函數。這種方式還支持向構造函數傳遞參數。叫法上把函數叫做構造函數,其他無區別適用情境可以在特殊的情況下用來為對象創建構造函數。 一、工廠模式 工廠模式:使用字面量和object構造函數會有很多重復代碼,在此基礎上改進showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
摘要:繼承的是超類型中構造函數中的屬性,如上繼承了屬性,但沒有繼承原型中的方法。上述造成的結果是子類型實例中有兩組超類型的構造函數中定義的屬性,一組在子類型的實例中,一組在子類型實例的原型中。 ECMAScript只支持實現繼承,主要依靠原型鏈來實現。與實現繼承對應的是接口繼承,由于script中函數沒有簽名,所以無法實現接口繼承。 一、原型鏈 基本思想:利用原型讓一個引用類型繼承另一個引用...
摘要:因此,所有在方法中定義的變量都是放在棧內存中的當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用因為對象的創建成本通常較大,這個運行時數據區就是堆內存。 上一篇:《javascript高級程序設計》筆記:繼承近幾篇博客都會圍繞著圖中的知識點展開 showImg(https://segmentfault.com/img/bVY0C4?w=1330&h=618);...
摘要:作用域鏈中的下一個變量對象來自包含外部環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象標識符解析沿作用域鏈一級一級搜索標識符。 一、寫在前面 最近研究了創建Android虛擬機、vscode結合weex開發Android APP、Vmware裝MAC虛擬機的事,看的內容不夠多,接下來加油 二、變量、作用域和...
摘要:解耦優勢代碼復用,單元測試。常用比較誤區可同時判斷,可用來判斷對象屬性是否存在。使用作判斷無法進行充分的類型檢查。文件中應用常量參考文檔高級程序設計作者以樂之名本文原創,有不當的地方歡迎指出。 showImg(https://segmentfault.com/img/bVburXw?w=500&h=400); 編寫可維護性代碼 可維護的代碼遵循原則: 可理解性 (方便他人理解) 直觀...
摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學習清單,發現僅有部分完成了。當然,這并不影響年是向上的一年在新的城市穩定連續堅持健身三個月早睡早起游戲時間大大縮減,學會生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學習清單,發現僅有部分完成了。當然,這并不影響2018年是向上的一年:在新的城市穩定、...
閱讀 1815·2019-08-30 15:55
閱讀 1007·2019-08-26 11:57
閱讀 508·2019-08-26 11:29
閱讀 3358·2019-08-26 10:49
閱讀 1910·2019-08-23 18:40
閱讀 1749·2019-08-23 16:04
閱讀 3104·2019-08-23 11:01
閱讀 2271·2019-08-23 10:56