《JavaScript高級(jí)程序設(shè)計(jì)》筆記5:引用類型

Object類型

  • 創(chuàng)建object實(shí)例方式一:使用new操作符跟Object構(gòu)造函數(shù)
var person = new Object();
person.name = "Nicholas";
person.age = 29;
  • 創(chuàng)建object實(shí)例方式二:使用對象字面量表示法(不會(huì)調(diào)用Object構(gòu)造函數(shù))
var person = {
  name : "Nicholas",
  age: 29
}

var person1 = {
  name : "Nicholas",
  age: 29,
  5 : true
}
//* 使用對象字面量表示法徐绑,屬性名也可以用字符串。
//* 上面數(shù)值屬性名5會(huì)自動(dòng)轉(zhuǎn)換為字符串莫辨。
//*  用person={}  ==> new Object()
  • 函數(shù)傳參(需要多個(gè)可選參數(shù)時(shí))傲茄,最好做法是:對必須值使用命名參數(shù),用對象字面量來封裝多個(gè)可選參數(shù)沮榜。例子如下:
function dispalyInfo(args){
  var output = "";
  if(typeof args.name == "string"){
    output  += "Name: "  + args.name + "\n";  
  }
  if (typeof args.age == "number"){
    output  += "Age: "  + args.age+ "\n";  
  }  
  alert(output);
}

displayInfo({
  name : "Nicholas",
  age : 29
});

displayInfo({
  name : "Greg"
});

// displayInfo函數(shù)接收一個(gè)args參數(shù)盘榨。
//參數(shù)可能帶有一個(gè)名為name或age屬性,也可能這個(gè)兩個(gè)屬性都有或者沒有蟆融。

Array類型

檢測數(shù)組

使用instanceof操作符:

if (value instanceof Array){
  //對數(shù)組執(zhí)行某些操作
}

ECMAScript5新增加Array.isArray()方法草巡。這個(gè)方法的目的是最終確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的型酥。這個(gè)方法如下:

if(Array.isArray(value)){
     //對數(shù)組執(zhí)行某些操作
}

IE9+及以上山憨,其它主流瀏覽器兼容查乒。

轉(zhuǎn)換方法

  • toLocaleString()方法
  • toString()方法
  • valueOf()方法
  • join()方法、
    前三種是所有對象都具有的方法郁竟。方法說明在本系列筆記3有詳細(xì)說明玛迄。其中:調(diào)用數(shù)組的toString方法會(huì)返回?cái)?shù)組中的每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串
    而調(diào)用valueOf()返回仍然是數(shù)組棚亩。
var colors = ['red', 'blue', 'green'];
console.log(colors.toString());
console.log(colors.valueOf());
console.log(colors.toLocaleString());

2468166859-59301e4ab875a_articlex.png

另外toLocaleString()方法經(jīng)常會(huì)返回跟toString()valueOf()方法相同的值蓖议。但也不是總?cè)绱恕.?dāng)調(diào)用數(shù)組的 toLocaleString()方法時(shí)讥蟆,它也會(huì)創(chuàng)建一個(gè)數(shù)組值的以逗號(hào)分割的字符串勒虾。而與前兩個(gè)方法唯一不同的是,這一次為了取得每一項(xiàng)的值瘸彤,調(diào)用的每一項(xiàng)的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()要接收字符串參數(shù)钧栖,所以它會(huì)在后臺(tái)調(diào)用toString()方法低零,得到跟直接調(diào)用toString()方法一樣的結(jié)果。

數(shù)組繼承的toLocaleString()拯杠、toString()掏婶、valueOf()方法,在默認(rèn)情況下都會(huì)以逗號(hào)分割的字符串的形式返回?cái)?shù)組項(xiàng)。可以使用join()方法索抓,則可以使用不同的分隔符來構(gòu)建這個(gè)字符串。

join()方法
join() 方法用于把數(shù)組中的所有元素放入一個(gè)字符串老厌。元素是通過指定的分隔符進(jìn)行分隔的。返回:一個(gè)字符串黎炉。

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

棧方法(后進(jìn)先出)

棧是一種LIFO(Last-In-First-Out,后進(jìn)先出)的數(shù)據(jù)結(jié)構(gòu)枝秤,也就是最新添加的元素最早被移除。

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

ArrayObj.push():就是向數(shù)組末尾添加新的元素慷嗜,返回的是:數(shù)組新的長度淀弹。
ArrayObj.pop():就是向數(shù)組中刪除數(shù)組最后一個(gè)元素并且:返回該元素。如果數(shù)組為空就返回:undefined庆械。

隊(duì)列方法(先進(jìn)先出)

  • ArrayObj.shift()
  • ArrayObj.unshift()

ArrayObj.shift():方法用于把數(shù)組中的第一個(gè)元素刪除薇溃,并返回:第一個(gè)元素的值
ArrayObj.unshift():該方法可把它的參數(shù)順序添加到數(shù)組的頭部缭乘。它直接修改了數(shù)組沐序,而不是創(chuàng)建一個(gè)新的數(shù)組。返回的:是新數(shù)組的長度
unshift()在IE6策幼,IE7下邑时,數(shù)據(jù)有添加成功,但返回值卻是undefined垄惧。

重排序方法

  • reverse()方法
  • sort()方法
    reverse()方法會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序。直接修改了數(shù)組到逊,而不是創(chuàng)建一個(gè)新數(shù)組
var values = [1, 2, 3, 6, 5];
values.reverse();
alert(values);  //5,6,3,2,1

sort()方法按升序排列數(shù)組——即最小的值位于最前面滤钱,最大的值排在最后面觉壶。為了實(shí)現(xiàn)排序他炊,sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)型方法争剿,然后比較得到字符串,以確定如何排序痊末。即使數(shù)組中的每一項(xiàng)都是數(shù)組蚕苇,sort()方法比較的也是字符串,如下所示:

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

sort()方法可以接受一個(gè)比較函數(shù)作為參數(shù)凿叠,以便我們指定那個(gè)值位于那個(gè)值的前面涩笤。

比較函數(shù)接受兩個(gè)參數(shù),如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前則返回一個(gè)負(fù)數(shù)盒件,如果兩個(gè)參數(shù)相等蹬碧,則返回0,如果第一個(gè)參數(shù)位于第二個(gè)之后則返回一個(gè)正數(shù)炒刁。以下就是一個(gè)簡單的比較函數(shù):

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

這個(gè)比較函數(shù)可以使用于大多數(shù)數(shù)據(jù)類型恩沽,只要將其作為參數(shù)傳遞給sort()方法即可,如下面這個(gè)例子所示:

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

在將比較函數(shù)傳遞到sort()方法之后翔始,數(shù)值仍然保持了正確的升序飒筑。當(dāng)然,也可以通過比較函數(shù)產(chǎn)生降序排序的結(jié)果绽昏,只要交換比較函數(shù)返回的值即可:

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

reverse()和sort()方法會(huì)返回值是經(jīng)過排序之后的數(shù)組协屡。

對于數(shù)值類型或者其valueOf方法會(huì)返回?cái)?shù)值類型的對象類型,可以使用一個(gè)更簡單的比較函數(shù)全谤。這個(gè)函數(shù)只要用第二個(gè)值減第一個(gè)值即可:

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

由于比較函數(shù)通過返回一個(gè)小于零肤晓、等于零或大于零的值來影響排序結(jié)果,因此減法操作就可以適當(dāng)處理所有情況。

操作方法

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

concat() 方法用于連接兩個(gè)或多個(gè)數(shù)組补憾。
該方法不會(huì)改變現(xiàn)有的數(shù)組漫萄,而僅僅會(huì)返回被連接數(shù)組的一個(gè)副本

var a = [1,2,3];
console.log(a.concat(4,5)); //[1,2,3,4,5]
console.log(a) //[1,2,3]

//也可以多個(gè)數(shù)組
//arrObj1.concat(arrObj2,arrObj3);

簡介slice()與splice()方法

slice(start,end)方法

start必需盈匾。規(guī)定從何處開始選取腾务。負(fù)數(shù):從數(shù)組尾部開始算起。-1是最后一個(gè)削饵,-2指倒數(shù)第二個(gè)元素岩瘦。
end可選。規(guī)定何處結(jié)束選取窿撬∑裘粒可負(fù)數(shù),同上劈伴。
返回:新數(shù)組密末。包含start到end(不包括在內(nèi))的arrayObj中的元素。

splice() 方法用于插入跛璧、刪除或替換數(shù)組的元素
語法:arrayObj.splice(index, howmany, ele1, ......, eleX)

index 必需严里。規(guī)定從何處添加/刪除元素。
必須數(shù)字追城,是開始插入或刪除的數(shù)組元素下標(biāo)田炭。

howmany必需。規(guī)定刪除多少元素漓柑。必須數(shù)字教硫。可以為"0"辆布。
未規(guī)定時(shí)瞬矩。刪除從index開始到原數(shù)組結(jié)尾的所有元素。

element1 可選锋玲。規(guī)定要添加到數(shù)組的新元素景用。從 index 所指的下標(biāo)處開始插入。
elementX 可選惭蹂∩〔澹可向數(shù)組添加若干元素。

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

slice()與splice()方法:
slice(start, end); slice()方法返回從參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項(xiàng)。如果有兩個(gè)參數(shù)廷雅,該方法返回起死和結(jié)束位置之間的項(xiàng)耗美,但不包括結(jié)束位置的項(xiàng)京髓。

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()有刪除,插入商架,替換的功能

  • 刪除 - 需要兩個(gè)參數(shù)堰怨,要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。
    • 直接修改本數(shù)組蛇摸。返回:刪除元素的數(shù)組备图。
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,2);
console.log(colors); // ["blue"]
console.log(removed); // ["red", "green"]
  • 插入 - 需要三個(gè)參數(shù):起始位置、0(要?jiǎng)h除的項(xiàng)數(shù))和要插入的項(xiàng)
    • 直接修改本數(shù)組赶袄。返回:刪除元素的數(shù)組揽涮。
var colors = ["red", "green", "blue"];
var removed = colors.splice(1,0,"yellow", "orange");
console.log(colors); // ["red", "yellow", "orange", "green", "blue"]
console.log(removed); // 返回空
  • 替換 - 需要三個(gè)參數(shù):起始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)弃鸦。
    • 直接修改本數(shù)組绞吁。返回:刪除元素的數(shù)組幢痘。
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為數(shù)組實(shí)例添加了兩個(gè)位置方法:indexOf()lastIndexOf()唬格。這兩個(gè)方法都接收兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引。其中indexOf()方法從數(shù)組開頭(位置0)開始向后查找颜说,lastIndexOf()方法則從數(shù)組的末尾開始向前查找购岗。

這兩個(gè)方法都返回查找的項(xiàng)在數(shù)組中的位置,或者沒有查找到的情況下返回-1门粪。在比較第一個(gè)參數(shù)與數(shù)組中的每一項(xiàng)時(shí)喊积,會(huì)使用全等操作符;也就是說要求查找的項(xiàng)必須嚴(yán)格相等(就像使用===一樣)玄妈。

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乾吻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拟蜻,更是在濱河造成了極大的恐慌绎签,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝锅,死亡現(xiàn)場離奇詭異诡必,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搔扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門爸舒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稿蹲,你說我怎么就攤上這事扭勉。” “怎么了苛聘?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵剖效,是天一觀的道長嫉入。 經(jīng)常有香客問我,道長璧尸,這世上最難降的妖魔是什么咒林? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮爷光,結(jié)果婚禮上垫竞,老公的妹妹穿的比我還像新娘。我一直安慰自己蛀序,他們只是感情好欢瞪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徐裸,像睡著了一般遣鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上重贺,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天骑祟,我揣著相機(jī)與錄音,去河邊找鬼气笙。 笑死次企,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潜圃。 我是一名探鬼主播缸棵,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谭期!你這毒婦竟也來了堵第?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隧出,失蹤者是張志新(化名)和其女友劉穎踏志,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸳劳,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狰贯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏廓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涵紊。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幔摸,靈堂內(nèi)的尸體忽然破棺而出摸柄,到底是詐尸還是另有隱情,我是刑警寧澤既忆,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布驱负,位于F島的核電站嗦玖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跃脊。R本人自食惡果不足惜宇挫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酪术。 院中可真熱鬧器瘪,春花似錦、人聲如沸绘雁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庐舟。三九已至欣除,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挪略,已是汗流浹背历帚。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘟檩,地道東北人抹缕。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓澈蟆,卻偏偏與公主長得像墨辛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子趴俘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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