Array對(duì)象

1.構(gòu)造函數(shù)

Array是JavaScript的內(nèi)置對(duì)象勺远,同時(shí)也是一個(gè)構(gòu)造函數(shù)增显,可以用它生成新的數(shù)組疗涉。
有沒有使用new易稠,運(yùn)行結(jié)果是一樣的:
var arr = new Array(2); 等同于 var arr = Array(2);

Array構(gòu)造函數(shù)有一個(gè)很大的問題就是不同的參數(shù)會(huì)導(dǎo)致它的行為不一致:
1.無(wú)參數(shù)時(shí)缸废,返回一個(gè)空數(shù)組
new Array() // []
2.單個(gè)正整數(shù)參數(shù),表示返回的新數(shù)組的長(zhǎng)度
new Array(1) // [ undefined ]
new Array(2) // [ undefined x 2]
3.非正整數(shù)的數(shù)值作為參數(shù)驶社,會(huì)報(bào)錯(cuò)
new Array(3.2) // RangeError:Invalid array length
new Array(-3) // RangeError:Invalid array length
4.單個(gè)非正整數(shù)參數(shù)(比如字符串企量、布爾值、對(duì)象等)衬吆,則該參數(shù)返回的新數(shù)組的成員
new Array('abc') // ['abc']
new Array([1]) // [Array[1]]
5.多參數(shù)時(shí)梁钾,所有參數(shù)都是返回的新數(shù)組的成員
new Array(1,2) // [1,2]
new Array('a','b','c') // ['a','b','c']
從上面的代碼看出,Array作為構(gòu)造函數(shù)逊抡,行為很不一致姆泻。因此直接使用數(shù)組字面量是更好的做法:
bad:
var arr = new Array(1,2)
good:
var arr = [1,2]

注意:
如果參數(shù)是一個(gè)正整數(shù)零酪,返回?cái)?shù)組的成員都是空位。雖然讀取的時(shí)候返回undefined拇勃,但實(shí)際上該位置沒有任何值四苇。雖然可以提取到length屬性,但是取不到鍵名方咆。

2.Array.isArray() 判斷一個(gè)值是否為數(shù)組

它可以彌補(bǔ)typeof運(yùn)算符的不足月腋。typeof運(yùn)算符只能顯示數(shù)組的類型是Object,而Array.isArray方法可以對(duì)數(shù)組返回true瓣赂。

var a = [1,2,3]

typeof a                 // "Object"
Array.isArray(a)       //true

3.Array實(shí)例的方法

3.1 valueOf(),toString()

valueOf方法返回?cái)?shù)組本身:

var a = [1,2,3];
a.valueof()         //[1,2,3]

toString方法返回?cái)?shù)組的字符串形式:

var a = [1,2,3]
a.toString()      //"1,2,3"

var a = [1,2,3,[4,5,6]];
a.toString()        //"1,2,3,4,5,6”
3.2 push()

push方法用于在數(shù)組的末端添加一個(gè)或多個(gè)元素榆骚,并返回添加新元素后的數(shù)組長(zhǎng)度。該方法會(huì)改變?cè)瓟?shù)組煌集。

3.3 pop()

pop方法用于刪除數(shù)組的最后一個(gè)元素妓肢,并返回該數(shù)組。該方法會(huì)改變?cè)瓟?shù)組苫纤。
對(duì)空數(shù)組使用pop方法碉钠,不會(huì)報(bào)錯(cuò),而是返回undefined卷拘。
push和pop結(jié)合使用喊废,就構(gòu)成了“先進(jìn)后出”的棧結(jié)構(gòu)。(stack)

3.4 join()

join方法以參數(shù)作為分隔符栗弟,將所有數(shù)組成員組成一個(gè)字符串返回污筷。如果不提供參數(shù),默認(rèn)用逗號(hào)分隔横腿。

var a = [1,2,3,4];   

a.join('')          //'1 2 3 4 '
a.join('|')         //"1|2|3|4"  
a.join()           //"1,2,3,4"

通過(guò)call方法颓屑,這個(gè)方法也可以用于字符串:

Array.prototype.join.call('hello','-')     //"h-e-l-l-o"

join方法也可以用于類似數(shù)組的對(duì)象。

3.5 concat()

concat方法用于多個(gè)數(shù)組的合并耿焊。它將新數(shù)組的成員揪惦,添加到原數(shù)組成員的后部,然后返回一個(gè)新數(shù)組罗侯,原數(shù)組不變器腋。

除了接受數(shù)組作為參數(shù),concat也可以接受其他類型的值作為參數(shù)钩杰。如果不提供參數(shù)纫塌,concat方法返回當(dāng)前數(shù)組的一個(gè)淺拷貝。所謂“淺拷貝”讲弄,指的是如果數(shù)組成員包括復(fù)合類型的值(比如對(duì)象)措左,則新數(shù)組拷貝的是該值的引用。

concat方法也可以用于將對(duì)象合并為數(shù)組避除。

[].concat({a:1},{b:2}) // [ {a:1} , {b:2} ]
[2].concat({a:1}) // [ 2 , {a:1} ]

3.6 shift()

unshift方法用于刪除數(shù)組的第一個(gè)元素怎披,并返回該數(shù)組胸嘁,該方法會(huì)改變?cè)瓟?shù)組。

shift方法可以遍歷并清空一個(gè)數(shù)組:

var list = [1,2,3,4,5,6];
vat item;

while (item = list.shift()) {    
console.log(item);
}    

list     // [ ]
3.7 unshift()

unshift方法用于在數(shù)組的第一個(gè)位置添加元素凉逛,并返回添加新元素后的數(shù)組長(zhǎng)度性宏,該方法會(huì)改變?cè)瓟?shù)組。
unshift方法可以在數(shù)組頭部添加多個(gè)元素状飞。

3.8 reverse()

reverse方法用于顛倒數(shù)組中元素的順序毫胜。并返回改變后的數(shù)組,該方法會(huì)改變?cè)瓟?shù)組诬辈。
var a = ['a','b','c'];

a.reverse()
a              // ["c","b","a"]
3.9 slice()

slice方法用于提取原數(shù)組的一部分酵使,并返回一個(gè)新數(shù)組,原數(shù)組不變焙糟。
它的第一個(gè)參數(shù)為起始位置(從0開始)凝化,第二個(gè)參數(shù)為終止位置(但該位置的元素本身不包括在內(nèi))。如果省略第二個(gè)參數(shù)酬荞,則一直返回到原數(shù)組的最后一個(gè)成員。
格式為: arr.slice(start_index,upto_index)
如果slice里沒有參數(shù)瞧哟,實(shí)際上返回一個(gè)原數(shù)組的拷貝混巧;
如果slice方法的參數(shù)是負(fù)數(shù),則表示倒數(shù)計(jì)算的位置勤揩。(-2:倒數(shù)第二個(gè)位置)

slice方法的一個(gè)重要應(yīng)用咧党,是將類似數(shù)組的對(duì)象轉(zhuǎn)為真正的數(shù)組。

Array.prototype.slice.call({0:'a',1:'b',length:2})     //['a','b']
 
Array.prototype.slice.call(document.querySelectorAll("div"));
Array.prototype.slice.call(argumrnts);

上面代碼的參數(shù)都不是數(shù)組陨亡,但通過(guò)call方法傍衡,在它們上面調(diào)用slice方法,就可以把它們轉(zhuǎn)為真正的數(shù)組负蠕。

3.10 splice()

splice方法用于刪除原數(shù)組的一部分蛙埂,并可以在被刪除的位置加入新的數(shù)組成員,返回值是被刪除的元素遮糖。原數(shù)組會(huì)被改變绣的。
splice的第一個(gè)參數(shù)是刪除的起始位置,第二個(gè)參數(shù)是被刪除的元素個(gè)數(shù)欲账。如果后面還有更多的參數(shù)屡江,則表示這些就是要被插入數(shù)組的新元素。

3.11 sort()

sort方法對(duì)數(shù)組成員進(jìn)行排序赛不,默認(rèn)是按照字典順序排序惩嘉,排序后,原數(shù)組會(huì)被改變踢故。
sort方法不是按照大小排序文黎,而是按照對(duì)應(yīng)字符串的字典順序排序惹苗。也就是說(shuō),數(shù)值會(huì)被先轉(zhuǎn)成字符串臊诊,再按照字典順序進(jìn)行比較鸽粉,所以101排在11的前面。
如果想讓sort方法按照自定義方式排序抓艳,可以傳入一個(gè)函數(shù)作為參數(shù)触机,表示按照自定義方法進(jìn)行排序。該函數(shù)本身又接受兩個(gè)參數(shù)玷或,表示進(jìn)行比較的兩個(gè)元素儡首。如果返回值大于0,表示第一個(gè)元素排在第二個(gè)元素后面偏友;其他情況下蔬胯,都是第一個(gè)元素排在第二個(gè)元素前面。

   a.sort(function(x,y){return x-y})      //從小到大
  a.sort(function(x,y){return y-x})      //從大到小
3.12 map()

map方法對(duì)數(shù)組的所有成員依次調(diào)用一個(gè)函數(shù)位他,根據(jù)函數(shù)結(jié)果返回一個(gè)新數(shù)組氛濒,原數(shù)組沒有變化。

var numbers = [1,2,3]

numbers.map(function (n) {
return n + 1;
});
//[2,3,4]

numbers
//[1,2,3]

map方法接受一個(gè)函數(shù)作為參數(shù)鹅髓。該函數(shù)調(diào)用時(shí)舞竿,map方法會(huì)將其傳入三個(gè)參數(shù),分別是當(dāng)前成員窿冯、當(dāng)前位置和數(shù)組本身骗奖。

[1,2,3].map(function(elem,index,arr){ //elem為當(dāng)前成員的值,index為當(dāng)前成員的位置醒串,arr為原數(shù)組
return elem*index;
});
//[0,2,6]

map方法不僅可以用于數(shù)組执桌,還可以用于字符串,用來(lái)遍歷字符串的每個(gè)字符芜赌。但是仰挣,不能直接使用,而要通過(guò)函數(shù)的call方法簡(jiǎn)介使用较鼓,或者先將字符串轉(zhuǎn)為數(shù)組椎木,然后使用。
var upper = function (x) {
reutrn x.toUpperCase();
};

[].map.call('abc',upper)
//['A','B','C']
//或者
'abc'.split('').map(upper)
//['A','B','C']

document.querySelectorAll方法返回DOM節(jié)點(diǎn)集合博烂,也可以用上面的方法遍歷香椎。

3.13 forEach()

forEach方法與map方法很相似,也是遍歷數(shù)組的所有成員禽篱,執(zhí)行某種操作畜伐,但是forEach方法一般不返回值,只用來(lái)操作數(shù)據(jù)躺率。如果需要有返回值玛界,一般使用map方法万矾。forEach方法的參數(shù)與map方法一致,也是一個(gè)函數(shù)慎框,數(shù)組的所有成員會(huì)依次執(zhí)行該函數(shù)良狈。它接受三個(gè)參數(shù),分別是當(dāng)前位置的值笨枯、當(dāng)前位置的編號(hào)和整個(gè)數(shù)組薪丁。
function log(element,index,array){
console.log('[' + index + '] = ' + element);
}

[2,5,9].forEach(log);
// [0] = 2
// [1] = 5
// [2] = 9

forEach方法也可以接受第二個(gè)參數(shù),用來(lái)綁定回調(diào)函數(shù)的this關(guān)鍵字馅精。
var out = [ ];

[1,2,3].forEach(function(elem) {
this.push(elem * elem);
},out);

out // [1,4,9]

空數(shù)組out 是forEach方法的第二個(gè)參數(shù)严嗜,結(jié)果回調(diào)函數(shù)內(nèi)部的this關(guān)鍵字就能指向out。這個(gè)函數(shù)對(duì)于多層this非常有用洲敢,因?yàn)槎鄬觮his通常指向是不一致的漫玄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市压彭,隨后出現(xiàn)的幾起案子睦优,更是在濱河造成了極大的恐慌,老刑警劉巖壮不,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刨秆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忆畅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門尸执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)家凯,“玉大人,你說(shuō)我怎么就攤上這事如失“砘澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵褪贵,是天一觀的道長(zhǎng)掂之。 經(jīng)常有香客問我,道長(zhǎng)脆丁,這世上最難降的妖魔是什么世舰? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮槽卫,結(jié)果婚禮上跟压,老公的妹妹穿的比我還像新娘。我一直安慰自己歼培,他們只是感情好震蒋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布茸塞。 她就那樣靜靜地躺著,像睡著了一般查剖。 火紅的嫁衣襯著肌膚如雪钾虐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天笋庄,我揣著相機(jī)與錄音效扫,去河邊找鬼。 笑死无切,一個(gè)胖子當(dāng)著我的面吹牛荡短,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哆键,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼掘托,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了籍嘹?” 一聲冷哼從身側(cè)響起闪盔,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辱士,沒想到半個(gè)月后泪掀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颂碘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年异赫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头岔。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔拳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峡竣,到底是詐尸還是另有隱情靠抑,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布适掰,位于F島的核電站颂碧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏类浪。R本人自食惡果不足惜载城,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费就。 院中可真熱鬧个曙,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猴贰,卻和暖如春对雪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背米绕。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工瑟捣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栅干。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓迈套,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碱鳞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桑李,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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