第5章杠茬、引用類型

引用類型的值(對(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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绑嘹,一起剝皮案震驚了整個(gè)濱河市稽荧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌工腋,老刑警劉巖姨丈,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異擅腰,居然都是意外死亡蟋恬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門趁冈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)歼争,“玉大人,你說(shuō)我怎么就攤上這事渗勘°迦蓿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵旺坠,是天一觀的道長(zhǎng)乔遮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)取刃,這世上最難降的妖魔是什么蹋肮? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任出刷,我火速辦了婚禮,結(jié)果婚禮上坯辩,老公的妹妹穿的比我還像新娘馁龟。我一直安慰自己,他們只是感情好漆魔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布坷檩。 她就那樣靜靜地躺著,像睡著了一般改抡。 火紅的嫁衣襯著肌膚如雪淌喻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天雀摘,我揣著相機(jī)與錄音裸删,去河邊找鬼。 笑死阵赠,一個(gè)胖子當(dāng)著我的面吹牛涯塔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播清蚀,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼生蚁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼你弦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轧简,失蹤者是張志新(化名)和其女友劉穎沸柔,沒(méi)想到半個(gè)月后眼俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慎颗,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嘶卧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尔觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芥吟,死狀恐怖侦铜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钟鸵,我是刑警寧澤钉稍,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站棺耍,受9級(jí)特大地震影響贡未,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一羞秤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧左敌,春花似錦瘾蛋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叼风,卻和暖如春取董,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背无宿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工茵汰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孽鸡。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓蹂午,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親彬碱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豆胸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 676評(píng)論 0 0
  • 剛放暑假,我的生活里就多了一只小狗巷疼,我們很想給這只小狗起的名字晚胡,但是就是想不出來(lái)。但是我想到了一點(diǎn)嚼沿,那就是我和弟弟...
    20小石頭常詩(shī)彥閱讀 118評(píng)論 0 0
  • 不知道估盘,要過(guò)八個(gè)路口才能寄出一封信, 不知道骡尽,一封信要貼六張郵票才能到達(dá)忿檩。 不知道,這封信要多久你才能收到爆阶, 不知...
    暮七閱讀 229評(píng)論 0 0
  • 牛腩洗凈燥透,放2匙鹽腌制10分鐘 土豆去皮,番茄去皮辨图,切塊洗凈瀝水班套,姜切片洗凈 起油鍋,下姜片故河,翻一下吱韭,下牛腩,翻炒...
    爆炸的沉默92閱讀 144評(píng)論 0 0