引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例月褥,在ECMAScript中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)瓢喉,用于將數(shù)據(jù)和功能組織在一起宁赤。新對(duì)象是使用new操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建。
var a = new Object();
5.1 Object類型
大多數(shù)引用類型都是Object類型的實(shí)例灯荧,Object也是使用的最多的引用類型礁击。一般通過(guò)字面量創(chuàng)建。
var a = {
x: 1,
y: 2
};
一般通過(guò)點(diǎn)表示法訪問(wèn)對(duì)象的屬性逗载,也可以使用方括號(hào)語(yǔ)法哆窿,方括號(hào)語(yǔ)法的優(yōu)點(diǎn)在于可以通過(guò)變量來(lái)訪問(wèn)屬性。
a.x;
a["x"];
a[name];
5.2 Array類型
ECMAScript中的數(shù)組可以保存任何類型的數(shù)據(jù)厉斟,并且大小可以動(dòng)態(tài)調(diào)整挚躯,可以隨著數(shù)據(jù)的添加自動(dòng)增長(zhǎng)以容納新增數(shù)據(jù)。
var a = [];
數(shù)組的項(xiàng)數(shù)保存在length屬性當(dāng)中擦秽,這個(gè)屬性始終返回0或者更大的值码荔,它不是只讀的,可以修改感挥,修改它會(huì)直接修改數(shù)組的長(zhǎng)度缩搅。
數(shù)組的最后一項(xiàng)索引始終是length-1,因此下一個(gè)新項(xiàng)的位置就是length触幼。
5.2.1 檢測(cè)數(shù)組
對(duì)于一個(gè)網(wǎng)頁(yè)或者一個(gè)全局作用域而言硼瓣,使用instanceof操作符檢測(cè)數(shù)組。
if (value instanceof Array){
// 執(zhí)行操作
}
當(dāng)存在多個(gè)框架,即當(dāng)存在多個(gè)全局作用域時(shí)堂鲤,兩個(gè)全局作用域之間互相傳遞的數(shù)組不是來(lái)源于同一個(gè)構(gòu)造函數(shù)亿傅,所以會(huì)返回false。ECMAScript5新增方法isArray()用來(lái)檢測(cè)數(shù)組瘟栖。
if (Array.isArray(value)){
// 執(zhí)行操作
}
5.2.2 轉(zhuǎn)換方法
數(shù)組的toString()方法返回由數(shù)組中每個(gè)值的字符串形式拼接而成葵擎,并以逗號(hào)隔開(kāi)的一個(gè)字符串(實(shí)際上是每一項(xiàng)分別調(diào)用toString()方法后再拼接)。數(shù)組的valueOf()方法返回?cái)?shù)組本身半哟。toLocaleString()方法返回與toString()方法相同酬滤,區(qū)別是每一項(xiàng)分別調(diào)用toLocaleString()方法。
var a =[1,2,3];
console.log(a.toString()); // "1,2,3"
console.log(a.valueOf()); // [1, 2, 3]
數(shù)組的join()方法返回與toString()方法相同寓涨,但可以接收一個(gè)參數(shù)敏晤,參數(shù)表示每一項(xiàng)之間的分隔符。
var a =[1,2,3];
console.log(a.join("|")); // 1|2|3
null和undefined的項(xiàng)在上述4個(gè)方法中返回空字符串缅茉。
5.2.3 棧方法
數(shù)組的push()方法可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組的末尾男摧,并返回修改后的數(shù)組的長(zhǎng)度蔬墩。而pop()方法則從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的length值耗拓,然后返回移除的項(xiàng)
var a =[1,2,3];
var b = a.push("x","y");
var c = a.pop();
console.log(b); // 5
console.log(c); // "y"
5.2.4 隊(duì)列方法
數(shù)組的shift()方法用來(lái)移除數(shù)組的第一項(xiàng)并將其返回拇颅,unshift()方法用來(lái)在數(shù)組的前端添加任意項(xiàng)并返回新數(shù)組的長(zhǎng)度。
var a =[1,2,3];
var b = a.shift();
var c = a.unshift("x","y");
console.log(b); // 1
console.log(c); // 4
5.2.5 重排序方法
數(shù)組的reverse()方法用來(lái)反轉(zhuǎn)整個(gè)數(shù)組的順序乔询,并返回排序之后的數(shù)組樟插。
var a =[1,2,3];
var b = a.reverse();
console.log(b); // [3,2,1]
數(shù)組的sort()方法在默認(rèn)情況下按升序排列,即最小值在最前面竿刁,最大值在最后面黄锤,但排序時(shí)是調(diào)用每一項(xiàng)的toString()方法,所以"10"會(huì)在"5"的前面食拜。sort()方法可以接收一個(gè)比較函數(shù)鸵熟,根據(jù)整個(gè)函數(shù)的返回值來(lái)進(jìn)行排序,返回負(fù)數(shù)則表示第一個(gè)值要位于第二個(gè)值前负甸,返回0則表示兩個(gè)值相等流强,返回正數(shù)則表示第一個(gè)值要位于第二個(gè)值之后。完成排序之后返回排序之后的數(shù)組呻待。
var a =[5,1,10];
var b = a.sort();
// 默認(rèn)不傳參數(shù)
console.log(b); // [1,10,5]
// 傳遞一個(gè)比較函數(shù)
var a =[5,1,10];
function arr(v1, v2) {
return v1 - v2;
}
var b = a.sort(arr);
console.log(b); // [1,5,10]
5.2.6 操作方法
數(shù)組的concat()方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組打月,當(dāng)未傳參數(shù)時(shí),復(fù)制當(dāng)前數(shù)組并返回副本蚕捉。當(dāng)傳入任意參數(shù)時(shí)奏篙,先創(chuàng)建一個(gè)當(dāng)前數(shù)組的副本,然后將接收到的參數(shù)添加到這個(gè)副本的末尾鱼冀,最后返回新構(gòu)建的數(shù)組报破,參數(shù)可以是其他數(shù)組悠就,會(huì)將其他數(shù)組的每一項(xiàng)都添加到創(chuàng)建的副本當(dāng)中。
var a =[1,2,3];
var b = a.concat();
var c = a.concat("x",["y","z"]);
console.log(b); // [1, 2, 3]
console.log(c); // [1, 2, 3, "x", "y", "z"]
數(shù)組的slice()方法用于返回當(dāng)前數(shù)組的一個(gè)部分充易,接收一個(gè)或兩個(gè)參數(shù)梗脾,當(dāng)傳入一個(gè)參數(shù)時(shí),表示要返回的起始位置盹靴,返回從該起始位置到數(shù)組末尾的所有項(xiàng)炸茧。當(dāng)傳入兩個(gè)參數(shù)時(shí),返回起始位置與結(jié)束位置之間的所有項(xiàng)(不包括結(jié)束位置)稿静。當(dāng)傳遞的參數(shù)是負(fù)值的時(shí)候梭冠,會(huì)使用數(shù)組的長(zhǎng)度加上該負(fù)值來(lái)確定相應(yīng)的位置。如果結(jié)束位置小于起始位置改备,則返回空數(shù)組控漠。
var a =[1,2,3,4,5];
var b = a.slice(1);
var c = a.slice(1,4);
var d = a.slice(-3,-1);
console.log(b); // [2, 3, 4, 5]
console.log(c); // [2, 3, 4]
console.log(d); // [3, 4]
數(shù)組的splice()方法有多種用法,主要用途是向數(shù)組的中部插入項(xiàng)悬钳。使用這種方法的方式有3種:
刪除:指定兩個(gè)參數(shù)盐捷,要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。返回被刪除的項(xiàng)組成的數(shù)組默勾,會(huì)修改原數(shù)組碉渡。
var a =[1,2,3,4,5];
var b = a.splice(1,2);
console.log(a); // [1, 4, 5]
console.log(b); // [2, 3]
插入:提供3個(gè)參數(shù),起始位置母剥、0(即要?jiǎng)h除的項(xiàng)數(shù)為0滞诺,表示不刪除)、要插入的項(xiàng)环疼。如果要插入多個(gè)項(xiàng)习霹,則繼續(xù)傳遞第4第5以至任意多項(xiàng)參數(shù)(傳遞的參數(shù)為數(shù)組時(shí),不會(huì)像concat()方法一樣將數(shù)組拆散炫隶,而是直接將整個(gè)數(shù)組作為一項(xiàng)插入)序愚,因?yàn)闆](méi)有項(xiàng)被刪除,所以修改完原數(shù)組之后返回一個(gè)空數(shù)組
var a =[1,2,3,4,5];
var b = a.splice(2,0,"x",["y","z"]);
console.log(a); // [1, 2, "x", ["x","y"], 3, 4, 5]
console.log(b); // []
替換:即當(dāng)插入用法中的第二個(gè)參數(shù)不為0時(shí)等限,先刪除對(duì)應(yīng)的項(xiàng)爸吮,再將后續(xù)的項(xiàng)插入,以達(dá)到傳遞的參數(shù)項(xiàng)替換數(shù)組中原項(xiàng)的效果望门。
var a =[1,2,3,4,5];
var b = a.splice(2,2,"x",["y","z"]);
console.log(a); // [1, 2, "x", ["x","y"], 5]
console.log(b); // [3, 4]
上述3種用法中的第一個(gè)參數(shù)同樣接收負(fù)值形娇,負(fù)值用法與slice()方法相同。
5.2.7 位置方法
數(shù)組有兩個(gè)位置查詢方法筹误,indexOf()和lastIndexOf()桐早,indexOf()表示從數(shù)組的開(kāi)頭開(kāi)始查詢,lastIndexOf()表示從數(shù)組的末尾開(kāi)始查詢。傳入的參數(shù)為需要查詢的項(xiàng)哄酝,在查詢比較時(shí)友存,使用的是全等(===)符號(hào),返回查詢到第一個(gè)符合條件的項(xiàng)的索引陶衅,未查詢到則返回-1屡立。
var a =[1,2,3,4,5,4];
console.log(a.indexOf(4)); // 3
console.log(a.lastIndexOf(4)); // 5
console.log(a.indexOf(6)); // -1
5.2.8 迭代方法
數(shù)組有5個(gè)迭代方法,每個(gè)方法都接收兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和運(yùn)行該函數(shù)的作用域?qū)ο螅ǖ诙€(gè)參數(shù)是可選的搀军,主要影響第一個(gè)參數(shù)所傳的函數(shù)中的this值)膨俐。傳入的函數(shù)接收3個(gè)參數(shù):數(shù)組的項(xiàng)的值,該項(xiàng)在數(shù)組中的位置罩句,數(shù)組本身焚刺。
every()方法:對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù),若每一項(xiàng)都返回true门烂,則返回true乳愉。
var a =[1,2,3,4,5];
var b = a.every(function (item,index,arr) {
return item>0;
});
console.log(b); // true
filter()方法:對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù),返回該運(yùn)行該函數(shù)會(huì)返回true的項(xiàng)組成的新數(shù)組屯远。
var a =[1,2,3,4,5];
var b = a.filter(function (item,index,arr) {
return item>3;
});
console.log(b); // [4,5]
forEach()方法:對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù)匾委,沒(méi)有返回值。
var a =[1,2,3,4,5];
a.forEach(function (item,index,arr) {
arr[index] = ++item;
});
console.log(a); // [2, 3, 4, 5, 6]
map()方法:對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù)氓润,返回每次函數(shù)調(diào)用結(jié)果組成的數(shù)組。
var a =[1,2,3,4,5];
var b = a.map(function (item,index,arr) {
return item*index;
});
console.log(b); // [0, 2, 6, 12, 20]
some()方法:對(duì)數(shù)組的每一項(xiàng)運(yùn)行傳入的函數(shù)薯鳍,如果該函數(shù)的任意一項(xiàng)返回true咖气,則返回true
var a =[1,2,3,4,5];
var b = a.some(function (item,index,arr) {
return item>3;
});
console.log(b); // true
5.2.8 歸并方法
數(shù)組的reduce()和reduceRight()方法用來(lái)歸并數(shù)組,reduce()方法從數(shù)組的第一項(xiàng)開(kāi)始挖滤,逐個(gè)遍歷到最后崩溪,而reduceRight()方法則從最后一項(xiàng)開(kāi)始,逐個(gè)遍歷到第一項(xiàng)斩松。兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一次歸并時(shí)調(diào)用的函數(shù)和作為歸并基礎(chǔ)的初始值(可選)伶唯。傳給兩個(gè)方法的函數(shù)會(huì)接受4個(gè)參數(shù):前一個(gè)值,當(dāng)前值惧盹,當(dāng)前項(xiàng)的索引和數(shù)組對(duì)象乳幸,逐個(gè)函數(shù)的返回值都會(huì)作為下一次迭代時(shí)函數(shù)的第一個(gè)參數(shù),因此第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上钧椰,第一個(gè)參數(shù)是數(shù)組第一項(xiàng)粹断,第二個(gè)參數(shù)是數(shù)組第二項(xiàng)。
var a =[1,2,3,4,5];
var b = a.reduce(function (prev, cur, index, arr) {
return prev + cur;
});
console.log(b); // 15
5.3 Date類型
ECMAScript中的Date類型使用UTC標(biāo)準(zhǔn)來(lái)保存日期嫡霞,即從1970年1月1日午夜0時(shí)開(kāi)始經(jīng)過(guò)的毫秒數(shù)瓶埋。
// 創(chuàng)建日期對(duì)象
var a = new Date(); // 獲取當(dāng)前日期
var b = new Date("2017/09/26 12:0:0"); // 獲取指定時(shí)間,傳遞字符串參數(shù)
var c = new Date(2017,8,26,12,0,0); // // 獲取指定時(shí)間,傳遞數(shù)值參數(shù)
console.log(a); // Tue Sep 26 2017 14:27:32 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
console.log(b); // Tue Sep 26 2017 12:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
console.log(c); // Tue Sep 26 2017 12:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
Date.now()方法直接獲取執(zhí)行這條代碼的時(shí)的時(shí)間养筒,返回毫秒數(shù)曾撤。
var a = Date.now();
console.log(a); // 1506407948177
5.3.1 繼承的方法
Date類型的valueOf()方法返回日期的毫秒表示,所以Date類型可以直接進(jìn)行比較晕粪。
var a = new Date("2017");
var b = new Date("2016");
console.log(a>b); // true 日期越晚挤悉,毫秒數(shù)值就越大。
5.3.2 日期/時(shí)間組件方法
所有方法文檔兵多。
主要方法有幾個(gè):
var a =new Date();
// 返回日期毫秒數(shù)
console.log(a.getTime()); // 1506408603633
// 返回日期4位數(shù)的年份
console.log(a.getFullYear()); // 2017
// 返回日期的月份尖啡,0~11表示1月~12月
console.log(a.getMonth()); // 8
// 返回日期月份中的天數(shù),1~31
console.log(a.getDate()); // 26
// 返回日期的星期數(shù)剩膘,星期日為0
console.log(a.getDay()); // 2
// 返回日期的小時(shí)數(shù)衅斩,0~23
console.log(a.getHours()); // 14
// 返回日期的分?jǐn)?shù),0~59
console.log(a.getMinutes()); // 50
// 返回日期的秒數(shù)怠褐,0~59
console.log(a.getSeconds()); // 3
5.4 RegExp類型
見(jiàn)鏈接
5.5 Function類型
兩種方式定義函數(shù)
// 函數(shù)聲明
function a() {}
// 函數(shù)表達(dá)式
var a = function () {}
函數(shù)聲明會(huì)被解析器率先讀取畏梆,并使其在執(zhí)行任何代碼之前可用。表達(dá)式必須等到解析器解析到他所在的代碼行時(shí)才會(huì)執(zhí)行奈懒。
函數(shù)沒(méi)有重載奠涌,同名函數(shù)會(huì)被覆蓋。
5.5.1作為值的函數(shù)
函數(shù)本身也可以作為值來(lái)使用磷杏,不僅可以把一個(gè)函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)溜畅,而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。要訪問(wèn)函數(shù)的指針而不執(zhí)行函數(shù)的話极祸,必須去掉函數(shù)名后面的那對(duì)括號(hào)慈格。
// 定義一個(gè)根據(jù)對(duì)象的指定屬性的值來(lái)排序的函數(shù)
function pro(proName) {
return function (obj1, obj2) {
var val1 = obj1[proName];
var val2 = obj2[proName];
if(val1<val2){
return -1;
}else if(val1>val2){
return 1;
}else{
return 0;
}
}
}
var data = [{a:"x",b:2},{a:"y",b:1}];
data.sort(pro("b"));
console.log(data[0].a); // y
5.5.2 函數(shù)內(nèi)部屬性
函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象,argument和this遥金,argument是一個(gè)類數(shù)組對(duì)象浴捆,它保存著傳入函數(shù)中的所有參數(shù),它還擁有一個(gè)callee的屬性稿械,該屬性是一個(gè)指針选泻,指向擁有這個(gè)argument對(duì)象的函數(shù)。
// 經(jīng)典階乘函數(shù)
function a(num) {
if(num<=1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
}
console.log(a(5)); // 120
this引用的是當(dāng)前函數(shù)執(zhí)行的環(huán)境對(duì)象美莫,在全局作用域中調(diào)用函數(shù)時(shí)页眯,this對(duì)象引用的就是window對(duì)象。
函數(shù)本身還有一個(gè)caller屬性厢呵,他表示調(diào)用當(dāng)前函數(shù)的函數(shù)的引用餐茵,即是哪個(gè)函數(shù)調(diào)用了當(dāng)前函數(shù)。
function a() {
console.log(arguments.callee.caller);
}
function b() {
a();
}
// 因?yàn)閎函數(shù)調(diào)用了a函數(shù)述吸,所以執(zhí)行b函數(shù)時(shí)忿族,a函數(shù)的caller屬性會(huì)指向b函數(shù)
b(); // ? b() { a(); }
argument對(duì)象還有caller屬性锣笨,但這個(gè)屬性在非嚴(yán)格模式下始終是undefined,在嚴(yán)格模式下訪問(wèn)會(huì)導(dǎo)致錯(cuò)誤道批,定義這個(gè)屬性是為了區(qū)分函數(shù)本身的caller屬性错英。
5.5.3 函數(shù)屬性和方法
函數(shù)包含兩個(gè)屬性,length和prototype隆豹,length表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)椭岩。
函數(shù)包含兩個(gè)方法,apply()和call()璃赡,apply()方法接收兩個(gè)參數(shù)判哥,一個(gè)是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是函數(shù)的參數(shù)數(shù)組碉考。第二個(gè)參數(shù)可以是Array的實(shí)例塌计,也可以是argument對(duì)象。
var x = "xyz";
var a = {x:"abc"};
function fun() {
console.log(this.x);
}
fun(); // xyz
fun.apply(a); // abc
call()方法與apply()方法的作用相同侯谁,區(qū)別僅在于接收參數(shù)方式不同锌仅,call()方法第一個(gè)參數(shù)也是在其中運(yùn)行函數(shù)的作用域,之后的參數(shù)為需要傳遞給函數(shù)的逐個(gè)參數(shù)墙贱。使用apply()和call()能夠擴(kuò)充函數(shù)的運(yùn)行的作用域热芹。
ECMAScript5新定義了bind()方法,這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例惨撇,這個(gè)函數(shù)的this值會(huì)被綁定到傳給bind()函數(shù)的值伊脓。
var a = {x:"abc"};
function fun() {
console.log(this.x);
}
var b = fun.bind(a);
// b已經(jīng)是一個(gè)函數(shù)的實(shí)例,其this值為a對(duì)象魁衙。
b(); // abc
5.6 基本包裝類型
ECMAScript提供了3個(gè)特殊的引用類型报腔,Boolean、Number和String纺棺。這些基本包裝類型與各自的基本類型值相對(duì)應(yīng),每當(dāng)讀取一個(gè)基本類型值時(shí)邪狞,后臺(tái)會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象祷蝌,從而讓我們能夠?qū)绢愋椭凳褂媚承┓椒āR妙愋秃突景b類型的區(qū)別就在于對(duì)象的生存期帆卓,使用new操作符創(chuàng)建的引用類型實(shí)例巨朦,在執(zhí)行流離開(kāi)當(dāng)前作用域之前都一直保存在內(nèi)存中,而讀取基本類型值時(shí)創(chuàng)建的基本包裝類型的對(duì)象剑令,在執(zhí)行代碼的瞬間結(jié)束后就被銷毀了糊啡,所以不能對(duì)基本類型值添加屬性和方法。
5.6.1 Boolean類型
永遠(yuǎn)不要使用Boolean類型
5.6.2 Number類型
Number類型的valueOf()方法返回基本類型值的數(shù)值吁津,toString()和toLocaleString()方法返回?cái)?shù)值的字符串表示棚蓄。
var a = 10;
console.log(a.valueOf()+10); // 20
console.log(a.toString()+10); // 1010
console.log(a.toLocaleString()+10); // 1010
toFixed()方法返回指定小數(shù)位的字符串形式堕扶,本身小數(shù)位小于參數(shù)則補(bǔ)0,大于參數(shù)則舍入梭依。
var a = 10.005;
var b = 10;
console.log(a.toFixed(2)); // 10.01
console.log(b.toFixed(2)); // 10.00
toExponential()方法返回指數(shù)表示法的字符串形式稍算。
var a = 10;
console.log(a.toExponential(2)); // 1.00e+1
toPrecision()會(huì)根據(jù)處理的數(shù)值來(lái)決定到底是使用toFixed()還是toExponential()
var a = 10;
console.log(a.toPrecision(1)); // 1e+1
console.log(a.toPrecision(2)); // 10
console.log(a.toPrecision(3)); // 10.0
5.6.3 String類型
每個(gè)String類型都有一個(gè)length屬性,表示字符串包含多少個(gè)字符役拴。雙字節(jié)符也算一個(gè)字符糊探。
var a = "Hello world";
console.log(a.length); // 11
字符方法:charAt()和charCodeAt(),這兩個(gè)方法接收一個(gè)參數(shù)河闰,即基于0的字符位置科平,charAt()返回指定位置的字符的字符串。charCodeAt()返回指定位置的字符的字符編碼姜性。
var a = "Hello world";
console.log(a.charAt(1)); // e
console.log(a.charCodeAt(1)); // 101
字符串操作方法:concat()瞪慧,用于將一個(gè)或多個(gè)字符串拼接起來(lái),不會(huì)改變?cè)址厶А?shí)際操作中使用+拼接字符串更方便汞贸。
var a = "Hello";
var b = " world";
var c = "!";
var d = a.concat(b,c);
console.log(d); // Hello world!
slice()、substr()印机、substring()三個(gè)方法返回被操作字符串的一個(gè)子字符串矢腻,都接收一個(gè)或兩個(gè)參數(shù),第一個(gè)參數(shù)指定子字符串開(kāi)始的位置射赛,第二個(gè)參數(shù)表示子字符串到哪里結(jié)束多柑。
slice()和substring()第二個(gè)參數(shù)指定的是子字符串最后一個(gè)字符后面的位置,substr()第二個(gè)參數(shù)指定的是返回字字符串的字符個(gè)數(shù)楣责。如果這3個(gè)方法沒(méi)有指定第二個(gè)參數(shù)竣灌,則以字符串長(zhǎng)度作為結(jié)束位置。這3個(gè)方法都不會(huì)修改原字符串秆麸。
var a = "Hello world!";
console.log(a.slice(1,3)); // el
console.log(a.substr(1,3)); // ell
console.log(a.substring(1,3)); // el
再給這3個(gè)方法傳遞負(fù)值時(shí)初嘹,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 a = "Hello world!";
console.log(a.slice(-5,-1)); // orld
console.log(a.substr(-5,3)); // orld
console.log(a.substring(-5,-1)); //
substring()方法會(huì)比較兩個(gè)參數(shù)房铭,會(huì)將較小數(shù)作為起始位置驻龟,較大數(shù)作為結(jié)束位置。
var a = "Hello world!";
// 相當(dāng)于調(diào)用a.substring(0,3)
console.log(a.substring(3,-4)); // Hel
字符串位置方法:indexOf()和lastIndexOf()兩個(gè)方法都是從一個(gè)字符串中搜索給定的子字符串缸匪,然后返回子字符串的位置翁狐,沒(méi)有找到則返回-1。indexOf()從開(kāi)頭開(kāi)始查找凌蔬,lastIndexOf()從結(jié)尾開(kāi)始查找露懒。
var a = "Hello world!";
console.log(a.indexOf("o")); // 4
console.log(a.lastIndexOf("o")); // 7
兩個(gè)方法都接收第二個(gè)參數(shù)闯冷,表示字符串從哪個(gè)位置開(kāi)始查找,indexOf()會(huì)忽略參數(shù)之前的所有字符隐锭,lastIndexOf()會(huì)忽略參數(shù)之后的所有字符窃躲。
var a = "Hello world!";
console.log(a.indexOf("o",6)); // 7
console.log(a.lastIndexOf("o",6)); // 4
字符串去除空格方法:trim()方法用來(lái)去除字符串開(kāi)頭和結(jié)尾的空格,返回的是子字符串钦睡,不會(huì)改變?cè)址?/p>
var a = " Hello world! ";
console.log(a.trim()); // Hello world!
字符串大小寫轉(zhuǎn)換方法:toLowerCase()蒂窒、toUpperCase()、toLocaleLowerCase()荞怒、toLocaleUpperCase()四個(gè)方法洒琢,toLowerCase()、toUpperCase()分別用來(lái)轉(zhuǎn)化為小寫和大寫褐桌,toLocaleLowerCase()衰抑、toLocaleUpperCase()兩個(gè)方法則是針對(duì)特定地區(qū)的大小寫轉(zhuǎn)換方法。大小寫轉(zhuǎn)換返回的都是子字符串荧嵌,不會(huì)改變?cè)址?/p>
var a = "Hello world!";
console.log(a.toLowerCase()); // hello world!
console.log(a.toUpperCase()); // HELLO WORLD!
字符串匹配方法呛踊,match()方法接收一個(gè)正則表達(dá)式,返回一個(gè)匹配相關(guān)數(shù)組啦撮。全局匹配時(shí)返回所有匹配成功項(xiàng)組成的數(shù)組谭网。
var a = "Hello world!";
var b = a.match(/o/);
console.log(b); // ["o", index: 4, input: "Hello world!"]
var c = a.match(/o/g);
console.log(c); // ["o", "o"]
search()方法接收一個(gè)正則表達(dá)式,返回字符串中第一個(gè)匹配項(xiàng)的索引赃春,沒(méi)有找到則返回-1愉择。
var a = "Hello world!";
var b = a.search(/o/g);
console.log(b); // 4
字符串替換方法:replace(),可以接收兩個(gè)參數(shù)织中,第一個(gè)參數(shù)可以是一個(gè)正則表達(dá)式或者一個(gè)字符串锥涕,第二個(gè)參數(shù)可以是一個(gè)字符串或者一個(gè)函數(shù)。如果第一個(gè)參數(shù)是一個(gè)字符串狭吼,則只會(huì)替換第一個(gè)匹配的子字符串层坠,使用正則表達(dá)式并且?guī)в術(shù)標(biāo)識(shí)符,才能替換全部匹配的子字符串刁笙。
var a = "cat,fat,sat,bat";
var b = a.replace(/at/g,"xy");
console.log(b); // cxy,fxy,sxy,bxy
第二個(gè)參數(shù)是一個(gè)函數(shù)時(shí)破花,在只有一個(gè)匹配項(xiàng)的情況下,會(huì)向函數(shù)傳遞3個(gè)參數(shù):模式的匹配項(xiàng)采盒、模式匹配項(xiàng)在字符串中的位置旧乞,原始字符串蔚润。在定義了多個(gè)捕獲組的情況下磅氨,傳遞給函數(shù)的參數(shù)依次是模式的匹配項(xiàng)、每個(gè)捕獲組的匹配項(xiàng)嫡纠,最后兩個(gè)參數(shù)依然是模式匹配項(xiàng)在字符串中的位置和原始字符串烦租。
var a = "Hello world";
var b = a.replace(/e/,function (match,pos,str) {
console.log(match,pos,str); // e 1 Hello world
});
split()方法可以基于指定的分隔符將一個(gè)字符串分割成多個(gè)子字符串延赌,并將結(jié)果放在一個(gè)數(shù)組中。分隔符可以是一個(gè)字符串叉橱,也可以是一個(gè)正則表達(dá)式挫以。這個(gè)方法還接收第二個(gè)可選的參數(shù),用來(lái)限制分割后的數(shù)組長(zhǎng)度窃祝。
var a = "cat,fat,sat,bat";
var b = a.split(",",3);
console.log(b); // ["cat", "fat", "sat"]
字符串的比較方法:localeCompare()方法用來(lái)比較兩個(gè)字符串掐松,根據(jù)字符串在字母表中的排序來(lái)返回,小于參數(shù)則返回-1粪小,等于參數(shù)返回0大磺,大于參數(shù)返回1
var a = "hello";
var b = a.localeCompare("hallo");
var c = a.localeCompare("hello");
var d = a.localeCompare("hfllo");
console.log(b); // 1
console.log(c); // 0
console.log(d); // -1
String構(gòu)造函數(shù)本身還有一個(gè)fromCharCode()方法,接收一個(gè)或多個(gè)字符編碼探膊,將其轉(zhuǎn)為字符串杠愧。
var a = String.fromCharCode(104,101,108,108,111);
console.log(a); // hello
5.7 單體內(nèi)置對(duì)象
5.7.1 Global對(duì)象
在web瀏覽器中Global對(duì)象即window對(duì)象。
5.7.2 Math對(duì)象
Math對(duì)象用來(lái)保存數(shù)學(xué)公式和信息逞壁,所有屬性和方法文檔流济。
利用Math的求最大最小值方法來(lái)求數(shù)組中的最大最小值:
var a = [1,2,3,4,5];
var b = Math.min.apply(Math,a);
console.log(b); // 1
舍入方法:Math.ceil()執(zhí)行向上舍入,Math.floor()執(zhí)行向下舍入腌闯,Math.round()執(zhí)行標(biāo)準(zhǔn)舍入绳瘟,即四舍五入。
var a = 1.5;
var b = Math.ceil(a);
var c = Math.floor(a);
var d = Math.round(a);
console.log(b); // 2
console.log(c); // 1
console.log(d); // 2
利用Math的求隨機(jī)值方法從某個(gè)范圍中取一個(gè)隨機(jī)值:
// 從1到10之間取一個(gè)隨機(jī)整數(shù)
var a = Math.floor(Math.random()*10+1);