一碱蒙、數(shù)組的基本概念
1. 定義:
值的有序集合。
值被稱為數(shù)組的元素。元素位置稱為索引(0-2^32-2);數(shù)組是動態(tài)的澎办,會根據(jù)需要增減。稀疏與稠密數(shù)組:length均大于最大的索引號金砍。
2. 創(chuàng)建:
- 數(shù)組直接量創(chuàng)建
- 調(diào)用構(gòu)造函數(shù)Array():
1. 無參數(shù):var a=new Array();
創(chuàng)建的是空數(shù)組局蚀,相當于數(shù)組直接兩[];
2.一個數(shù)值參數(shù):var a=new Array(10);
創(chuàng)建的是指定長度的數(shù)組恕稠;
3.顯示指定兩個或多個參數(shù):var a=new Array(5,4,3,2,1,"testing,testing")
,構(gòu)造函數(shù)的參數(shù)成為新數(shù)組的元素琅绅。
3.數(shù)組的讀寫:
使用[]操作符來訪問數(shù)組元素。
注意:屬性名與索引:在0-2^32-2范圍內(nèi)的非負整數(shù)屬性名才是索引鹅巍,數(shù)組會自動維護其length屬性值千扶。
4.稀松數(shù)組:
包含從0開始的不連續(xù)索引的數(shù)組料祠。
創(chuàng)建方法:
* 使用一個數(shù)值參數(shù)的Array構(gòu)造函數(shù)
* 指定數(shù)組的索引值大于當前數(shù)組長度
* delete操作符
5.數(shù)組長度
稠密數(shù)組中l(wèi)ength=數(shù)組中的元素個數(shù);
設(shè)置length屬性小于當前長度的非負整數(shù)值n時澎羞,數(shù)組中≥n的元素會被刪除掉髓绽;
6.數(shù)組元素的添加和刪除:
- 添加:為新索引賦值;push()和unshift()方法在末尾或開頭增加數(shù)組元素妆绞。
- 刪除:delete操作顺呕,副作用是變?yōu)橄∷蓴?shù)組;pop()和shift()方法在末尾或開頭刪除數(shù)組元素摆碉。
7.數(shù)組遍歷:
for(var i=0,len=keys.length;i<len;i++){/*語句*/}
在對稀松的數(shù)組使用for循環(huán)遍歷時進行檢測塘匣;也可使用for/in循環(huán)進行遍歷。
8.多維數(shù)組:
JavaScript不支持多維數(shù)組巷帝,但可用數(shù)組的數(shù)組近似獲得(即數(shù)組的元素為數(shù)組)忌卤。
二.數(shù)組方法:
(一)ECMAScript3在Array.prototype中定義的一些操作數(shù)組的函數(shù)。
- join():將所有元素轉(zhuǎn)化為字符串并連接在一起楞泼,返回最后生成的字符串驰徊;
var a=[1,2,3];
a.join(); //=>"1,2,3"
a.join(" ") //=>"1 2 3"
a.join("") //=>"123"
var b=new Array(10); //長度為10的空數(shù)組;
b.join('-') //=>'---------':9個連字符組成的字符串
- reverse():將數(shù)組中的元素顛倒順序堕阔,返回逆序的數(shù)組棍厂;
var a=[1,2,3];
a.reverse().join(); //=>"3,2,1",并且現(xiàn)在的a是[3, 2, 1]
- sort():將數(shù)組的元素排序并返回排序后的數(shù)組。當不帶參數(shù)時調(diào)用按照字母表順序排序(如包含undefined會被排到尾部)超陆;如果按照其他方式牺弹,需要傳遞一個比較函數(shù)。這個函數(shù)決定了它的兩個參數(shù)在排好序的數(shù)組中的先后順序时呀。假設(shè)第一個參數(shù)應該在前张漂,則比較函數(shù)應該返回一個小于0的數(shù)值;反之谨娜,如第一個參數(shù)應該在后航攒,則返回大于0的數(shù)值;并且假設(shè)兩個值相等則返回0趴梢;
var a=[33,4,1111,222];
a.sort() //=>字母表順序:[1111, 222, 33, 4]
a.sort(function(a,b){
return a-b;
}) //=>數(shù)值順序:根據(jù)返回的正負或0來判斷漠畜;[4, 33, 222, 1111]
a.sort(function(a,b){
return b-a;
}) //=>數(shù)值相反的順序:[1111, 222, 33, 4]
更復雜的排序:
var a=['ant','Bug','cat','Dog']
a.sort(); //區(qū)分大小寫的排序:["Bug", "Dog", "ant", "cat"]
a.sort(function(s,t){//不區(qū)分大小寫的排序
var a=s.toLowerCase();
var b=t.toLowerCase();
if(a<b) return -1;
if(a>b) return 1;
return 0;
}); //=>["ant", "Bug", "cat", "Dog"]
- concat():創(chuàng)建并返回一個數(shù)組。它的元素包括調(diào)用concat()的原始數(shù)組的元素和concat()的每個參數(shù)坞靶。
注意:如果這些參數(shù)中的任何一個自身是數(shù)組憔狞,則連接的是數(shù)組的元素,而非數(shù)組本身彰阴。但不會遞歸躯喇。
var a=[1,2,3];
a.concat(4,5); //返回[1,2,3,4,5]
a.concat([4,5]); //返回[1,2,3,4,5]
a.concat([4,5],[6,7]);//返回[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]);//返回[1,2,3,4,5,[6,7]]
- slice():返回制定數(shù)組的一個片段或子數(shù)組。它的兩個參數(shù)分別指定了開始和結(jié)束位置。其中負數(shù)表示相對于數(shù)組中最后一個元素的位置廉丽。返回的數(shù)組包含第一個參數(shù)指定位置到不包含第二個參數(shù)之間的所有數(shù)組元素倦微。
注意:slice()不會修改調(diào)用的數(shù)組
var a=[1,2,3,4,5];
a.slice(0,3) //返回[1,2,3]
a.slice(3) //返回[4,5]
a.slice(1,-1) //返回[2,3,4]
a.slice(-3,-2) //返回[3]
- splice():在數(shù)組中插入或刪除元素的通用方法,會修改調(diào)用的數(shù)組正压。
splice()的前兩個參數(shù)指定了需要刪除的數(shù)組元素欣福。緊隨其后的任一個數(shù)的參數(shù)指定了需要插入到數(shù)組中的元素,從第一個參數(shù)的位置開始插入焦履。
splice()返回一個由刪除元素組成的數(shù)組拓劝,或者如果沒有刪除就返回一個空數(shù)組
var a=[1,2,3,4,5,6,7,8];
a.splice(4); //返回[5,6,7,8],a是[1, 2, 3, 4]
a.splice(1,2); //返回返回[2,3],a是[1, 4]
a.splice(1,1); //返回[4],a是[1]
var a=[1,2,3,4,5];
a.splice(2,0,'a','b') //返回[],a是[1, 2, "a", "b", 3, 4, 5]
a.splice(2,2,[1,2],3) //返回["a", "b"],a是[1, 2, [1,2], 3, 3, 4, 5]
- push()與pop():
這兩個方法允許將數(shù)組當做棧來使用。
- push()方法在數(shù)組的尾部添加一個活多個元素嘉裤,并返回數(shù)組的長度郑临。
- pop()方法則相反,它刪除數(shù)組的最后一個元素屑宠,減小數(shù)組的長度并返回它刪除的值厢洞。
注意:會修改并替換原始數(shù)組
- unshift()與shift():
這兩個方法行為非常類似于push()與pop();不一樣的是它是在數(shù)組的頭部而不是尾部進行元素的插入和刪除操作。 - toString()與toLocalString():
數(shù)組和其他JavaScript對象一樣擁有toString()方法典奉。針對數(shù)組躺翻,該方法將其每個元素轉(zhuǎn)化為字符串并且用逗號隔開。(和不加任何參數(shù)的join()方法返回的字符串一樣)卫玖。toLocalString是本地化版本公你。
下列代碼在谷歌瀏覽器打開時,會彈出“Uncaught TypeError: Cannot read property 'toString' of undefined”錯誤假瞬,放到console.log()中不會
[1,2,3].toString() //'生成1,2,3'
["a","b","c"].toString()//生成'a,b,c'
[1,[2,'c']].toString()//生成'1,2,c'
(二)ECMAScript5定義了9個新的數(shù)組方法來遍歷陕靠、映射、過濾脱茉、檢測剪芥、簡化和搜索數(shù)組。
一般性規(guī)律:大部分ES5的數(shù)組方法第一個參數(shù)都是接收一個函數(shù)并對數(shù)組的每一個元素進行調(diào)用芦劣,大多數(shù)情況下調(diào)用提供的函數(shù)使用三個參數(shù):數(shù)組元素、數(shù)組索引和數(shù)組本身说榆。第二個參數(shù)是可選的虚吟。
- forEach():從頭至尾遍歷數(shù)組,為每個元素指定調(diào)用的函數(shù)签财。
var data=[1,2,3,4,5];
//計算數(shù)組元素的和值
var sum=0;
data.forEach(function(value){
sum +=value;
})
sum //=>15
- map():將調(diào)用的數(shù)組的每個元素傳遞給指定的函數(shù)串慰,并返回一個數(shù)組,它包含函數(shù)的返回值唱蒸。注意返回的是新數(shù)組邦鲫,不會修改調(diào)用的數(shù)組
var a=[1,2,3];
b=a.map(function(x){
return x*x
}); //b是[1,4,9]
- filter():返回的數(shù)組元素是調(diào)用的數(shù)組的一個子集。傳遞的函數(shù)事用來做邏輯判定的,該函數(shù)返回true或false庆捺;
var a=[5,4,3,2,1];
smallvalues=a.filter(function(x){
return x<3
}) //[2,1]
everyother=a.filter(function(x,i){
return i%2==0
}) //[5, 3, 1]
- every()與some()
- reduce()與reduceRight()
- indexOf()與lastIndexOf()
三古今、數(shù)組類型
1.定義:
數(shù)組是具有特殊行為的對象。給一個未知的對象滔以,判定它是否為數(shù)組非常有用捉腥。
- ECMAScript5中可以用Array.isArray()函數(shù)來做;
Array.isArray([]); //=>true
Array.isArray({}); //=>false`
- 在ES5之前你画,typeof幫不上忙對數(shù)組僅返回“對象”抵碟,instanceof操作符只能用于簡單的情形(web多窗體或窗口存在)。
//ES5之前判斷對象時數(shù)組的方法
var isArray=Function.isArray || function(o){
return typeof o ==="object" &&
Object.prototype.toString.call(o)==="[object Array]"
}
2.類數(shù)組對象
- 定義:把擁有一個數(shù)值length屬性和對應非負整數(shù)屬性的對象看做一種類型的數(shù)組坏匪。
Arguments對象就是一個類數(shù)組對象拟逮,DOM方法如document.getElementsByTagName()也返回類數(shù)組對象。
//下面這個函數(shù)用來檢測類數(shù)組對象
//判定o是否為一個類數(shù)組對象
//字符串和函數(shù)有l(wèi)ength屬性适滓,但是它們可以用typeof檢測將其排除敦迄。
//在客戶端JavaScript中,DOM文本節(jié)點也有l(wèi)ength屬性粒竖,需要額外判斷o.nodeType!=3將其排除
function isArrayLike(o){
if(o && //o非null颅崩、undefined等
typeof o==="object" && //o是對象
isFinite(o.length) && //o.length是有限數(shù)值
o.length >=0 && //o.length為非負值
o.length===Math.floor(o.length)&& //o.length是整數(shù)
o.length<4294967296) //o.length<2^32
return true;
else
return false; //否則它不是
}
- 類數(shù)組對象沒有繼承自Array.prototype,不能直接在它們上面調(diào)用數(shù)組方法蕊苗,可以間接地使用Function.call方法調(diào)用沿后。
var a={"0":"a","1":"b","2":"c",length:3}; //類數(shù)組對象
Array.prototype.join.call(a,"+") //=>"a+b+c"
Array.prototype.slice.call(a,0) //["a", "b", "c"]:真正數(shù)組的副本
Array.prototype.map.call(a,function(x){
return x.toUpperCase();
}) //=>["A", "B", "C"]
//在Firefox 1.5中將這些方法的版本在Array構(gòu)造函數(shù)上直接定義為函數(shù),這樣上述例子可以這樣重寫
var a={"0":"a","1":"b","2":"c",length:3};
Array.join(a,"+")
Array.slice(a,0)
Array.map(a,function(x){return x.toUpperCase();})
//由于這些不是標準的朽砰,可以增加以下代碼兼容所有瀏覽器:
Array.join=Array.join || function(a,sep){
return Array.prototype.join.call(a,sep);
}
Array.slice=Array.slice || function(a,from,to){
return Array.prototype.slice.call(a,from,to);
}
Array.map=Array.map || function(a,f,thisArg){
return Array.prototype.map.call(a,f,thisArg)
}
3.作為數(shù)組的字符串
除用charAt()方法訪問單個字符以外尖滚,可以用方括號。另可將通用的數(shù)組方法應用到字符串上瞧柔。
var s="JavaScript";
Array.prototype.join.call(s," ") //=>J a v a S c r i p t
Array.prototype.filter.call(s,function(x){ //過濾字符串的字符
return x.match(/[^aeiou]/); //只匹配非元音字符
}).join("")
請記灼崤:字符串是不可變值,故把它們看做數(shù)組時造锅,它們也是只讀的撼唾。如push()、sort()哥蔚、reverse()和splice()等數(shù)組方法在字符串上市無效的倒谷,且使用數(shù)組方法修改字符串導致錯誤,出錯的時候是沒有提示的