數(shù)組的定義
數(shù)組是按序號排列的一組值酌畜,每個值的位置都有編號(從0開始)。數(shù)組本質(zhì)上是一種特殊的對象穆律。它的鍵名是按(0,1导俘,2...)排列的一組數(shù)字峦耘。
-
創(chuàng)建數(shù)組:
var arr = new Array(values); var arr = [vaules];
-
判斷比是否是個數(shù)組
- Array.isArray(arr)
- arr instanceof Array
取數(shù)組元素
arr[index]-
length
屬性
返回數(shù)組的成員數(shù)量。
Javascript使用一個32位整數(shù)旅薄,保存數(shù)組的元素個數(shù)辅髓。這意味著數(shù)組的成員最多只有4294967295個(232-1)。var arr = ['a','b']; arr.length // 2 arr.[10] = 'c' arr.length //11
從上面的輸出結(jié)果可以看出少梁,
length
屬性可以動態(tài)變化洛口,如果將length屬性設(shè)為 0 ,就會將數(shù)組清空凯沪。如果設(shè)置的數(shù)小于原有的個數(shù)第焰,那么在這個數(shù)后面的數(shù)值就自動刪除了。反過來妨马,如果設(shè)置的數(shù)大于原有的個數(shù)挺举,數(shù)組的成員將增大,都為undefined
烘跺。var a = [1,2]; a.length = 5; a[4] // undefined a.length = 1; a.[1] // undefined a.length = 0; a //[]
-
增加數(shù)組元素
-
push()
方法 在數(shù)組的末尾增加一個或多個元素湘纵,并返回數(shù)組的新長度。 -
unshift()
方法 在數(shù)組的開頭增加一個或多個元素滤淳,并返回數(shù)組的新長度梧喷。 -
length
屬性
var arr = [1, 2, 3] arr.push(4) arr // 1, 2, 3, 4 arr.unshift(6) arr // 6, 1, 2, 3, 4 arr[arr.length] = 7 // 與push()方法類似 arr // 6, 1, 2, 3, 4, 7
-
-
刪除數(shù)組中的元素
-
delete
運(yùn)算符,可以刪除數(shù)組中的某個元素,但這不會改變length
屬性的值. -
pop()
方法 刪除數(shù)組的最后一個元素铺敌,并返回這個元素绊困。 -
shift()
方法 刪除數(shù)組的第一個元素,并返回這個元素适刀。
var arr = [1,2,3]; delete arr[0]; arr // [undefined,2,3] arr.length // 3 var last = arr.pop() var first = arr.shift() last // 3 first // undefined arr //2
-
類數(shù)組對象
在js中,有些對象被叫做“類數(shù)組對象”(array-like object)煤蹭,因?yàn)檫@些對象看起來很像數(shù)組笔喉,可以使用length
屬性,但是無法使用數(shù)組的方法硝皂。
典型的類數(shù)組對象是函數(shù)的arguments
對象常挚,以及大多數(shù)DOM元素集,還有字符串稽物。
// arguments對象
function args() {return arguments; }
var arraylike = args('a','b')
arrayLike[0] // 'a'
arrayLike.length // 2
arrayLike instanceof Array // false
Array.isArray(arrayLike) // false
// DOM元素集
var elts = document.getElementsByTagName('p');
elts.length // 3
eles instanceof Array // false
//字符串
'abc'[1] // 'b'
'abc'.length // 3
'abc' instanceof Array // false
數(shù)組的slice
方法能將類數(shù)組對象奄毡,變成真正的數(shù)組。slice
方法后面會結(jié)介紹贝或。
var arr = Array.prototype.slice.call(arrayLike);
數(shù)組的遍歷
-
for...in 循環(huán)
var a =[1, 2, 3]; a.other = 'other'; for (var i in arr){ console.log( arr[i]); } // 1, 2, 3, other
從上面的輸出結(jié)果可以看出吼过,利用for..in循環(huán)會將動態(tài)添加的非數(shù)字鍵的值遍歷出來,因此需要使用的時候需要注意咪奖。
-
for 循環(huán)和 while 循環(huán)
var a = [1, 2, 3]; // for循環(huán) for(var i = 0; i < a.length; i++) { console.log(a[i]); } // while循環(huán) var i = 0; while (i < a.length) { console.log(a[i]); i++; } var l = a.length; while (l--) { console.log(a[l]); }
-
forEach()
方法//array.forEach(callback[, thisArg]) //callback 在數(shù)組的每一項(xiàng)上執(zhí)行的函數(shù)盗忱,接受三個參數(shù):item: 數(shù)組當(dāng)前項(xiàng)的值,index: 當(dāng)前項(xiàng)的索引羊赵,arr:數(shù)組本身趟佃。 var arr = [1, 2, 3] arr.forEach(function(item, index, arr){ console.log(item, index); }); //1 0 //2 1 //3 2
數(shù)組常用的方法
-
join() 將數(shù)值轉(zhuǎn)換為字符串
var arr = [1, 2, 3]; arr.join(); // "1,2,3" arr.join("_"); // "1_2_3"
-
reverse() 將數(shù)組逆序
// 原數(shù)組會被修改 var arr = [1, 2, 3]; arr.reverse(); // [3, 2, 1] arr; // [3, 2, 1]
-
sort() 數(shù)組排序
默認(rèn)情況下是升序排列的,底層是調(diào)用了每個數(shù)組項(xiàng)的 toString() 方法昧捷,然后比較得到字符串闲昭,即使每個數(shù)組項(xiàng)的數(shù)值是數(shù)字,比較的也是字符串靡挥。// 原數(shù)組會被修改 var arr = [1, 12, 213, 1432, 'a']; arr.sort(); // [1, 12, 1432, 213, "a"] arr.sort(function(a, b){ return b-a; //按倒序排列數(shù)組 });
-
concat() 數(shù)組合并
用法:array.concat(value1, value2, ..., valueN)// 原數(shù)組不會被修改 var arr =[1, 2, 3] arr.concat(4, 5); arr; //[1, 2, 3] arr.concat([11,2],3); // [1, 2, 3, 11, 2, 3]
-
slice() 返回部分?jǐn)?shù)組
用法:array.slice(begin[,end])slice用于復(fù)制數(shù)組序矩,復(fù)制完后舊數(shù)組不變,返回得到的新數(shù)組是舊數(shù)組的子集芹血。
第一個參數(shù)begin是開始復(fù)制的位置贮泞,需要注意的是,可以設(shè)負(fù)數(shù)幔烛。設(shè)負(fù)數(shù)表示從尾往前數(shù)幾個位置開始復(fù)制啃擦。例如slice(-2)將從倒數(shù)第2個元素開始復(fù)制。另外需要注意的是饿悬,該參數(shù)雖未標(biāo)注為可選令蛉,但實(shí)際上是可以省略的,省略的話默認(rèn)為0。
第二個參數(shù)end可選珠叔,表示復(fù)制到該位置的前一個元素蝎宇。例如slice(0,3)將得到前3個元素,但不包含第4個元素祷安。不設(shè)的話默認(rèn)復(fù)制到數(shù)組尾姥芥,即等于array.length。
//原數(shù)組不會被修改 var arr = [1, 2, 3, 4, 5]; arr.slice(); //[1, 2, 3, 4, 5] arr.slice(1,3); // [2, 3] arr.slice(1, -1); // [2, 3, 4] arr; // [1, 2, 3, 4, 5]
-
splice() 數(shù)組拼接
用法:array.splice(start, deleteCount[, item1[, item2[, ...]]])- start 指要從哪一位開始修改內(nèi)容汇鞭,如果超出了數(shù)組的長度凉唐,則從數(shù)組末尾開始添加內(nèi)容;如果是負(fù)值霍骄,則表示從數(shù)組末位開始的第幾位台囱。
- deleteCount 表示要移除的數(shù)組元素的個數(shù)
- item 要添加進(jìn)數(shù)組的元素
最主要的的用途是向數(shù)組的中部插入元素。
//原數(shù)組會被修改 var arr = [1, 2, 3, 4, 5]; //從第三個數(shù)組元素刪除 arr.splice(2); // returns [3, 4, 5] arr; // [1, 2] //從第三個數(shù)組元素刪除读整,刪除兩個元素 arr.splice(2, 2) // returns [3, 4] arr; // [1, 2, 5] //將'a','b'替換到數(shù)組的第二個元素 arr.splice(1, 1, 'a', 'b')
-
forEach() 數(shù)組遍歷
用法:array.forEach(callback[, thisArg])
callback 在數(shù)組的每一項(xiàng)上執(zhí)行的函數(shù)簿训,接受三個參數(shù):item:數(shù)組當(dāng)前項(xiàng)的值,index: 當(dāng)前項(xiàng)的索引米间,arr:數(shù)組本身强品。var arr = [1, 2, 3] arr.forEach(function(item, index, arr){ console.log(item, index); }); //1 0 //2 1 //3 2
-
map() 數(shù)組映射
map映射創(chuàng)建新數(shù)組,用法: map(function(value, index, array) { … }, [thisArg] );车伞。和forEach一樣择懂,不贅述。唯一需要注意的的是回調(diào)函數(shù)需要有return值另玖,否則新數(shù)組都是undefined困曙。其實(shí)map能干的事forEach都能干,你可以把map理解為forEach的一個特例谦去,專門用于:通過現(xiàn)有的數(shù)組建立新數(shù)組慷丽。
//原數(shù)組未被修改 var arr= [1, 2, 3]; arr.map(function(x){ return x+10; // 需要 return 值,否則新數(shù)組里都是 undefined }); // [11, 12, 13] arr; // [1, 2, 3]
-
filter() 數(shù)組過濾
filter用于過濾數(shù)組鳄哭,用法: filter( function(value, index, array) { … }, [thisArg] ); 要糊。唯一需要注意的的是回調(diào)函數(shù)需要return布爾值true或false,//原數(shù)組未被修改 var arr= [1, 2, 3, 4, 5, 6, 7, 8]; arr.filter(function(x,index){ return x%2 == 0; }); // [2, 4, 6, 8] arr; // [1, 2, 3, 4, 5, 6, 7, 8]
-
every() some() 數(shù)組判斷
some表示只要某一個滿足條件就OK妆丘,every表示全部滿足條件才OK锄俄。
用法:- arr.every(callback[, thisArg])
- arr.some(callback[,thisArg])
var arr= [1, 2, 3, 4, 5]; arr.every(function(x){ return x < 6; }); // true arr.every(function(x){ return x > 6; }); // false arr.some(function(x){ return x === 1; }); // true arr.some(function(x){ return x === 6; }); // false
-
reduce() reduceRight()
reduce() 方法接收一個函數(shù)作為累加器(accumulator),數(shù)組中的每個值(從左到右)開始合并勺拣,最終為一個值奶赠。 兩者都是用于迭代運(yùn)算。區(qū)別是reduce從頭開始迭代药有,reduceRight從尾開始迭代毅戈。用法: reduce( function(previousValue, currentValue, currentIndex, array) { … }, [initialValue] );
第一個參數(shù)是回調(diào)函數(shù)苹丸,有4個參數(shù):previousValue,currentValue苇经,currentIndex赘理,array∩鹊ィ看名字也能知道意思:前一個值商模,當(dāng)前值,當(dāng)前索引蜘澜,數(shù)組本身阻桅。
第二個參數(shù)initialValue可選,表示初始值兼都。如果省略,初始值為數(shù)組的第一個元素稽寒,這樣的話回調(diào)函數(shù)里previousValue就是第一個元素扮碧,currentValue是第二個元素。因此不設(shè)initialValue的話杏糙,會少一次迭代慎王。
//將數(shù)組所有項(xiàng)相加 var arr = [0, 1, 2, 3]; var sum = arr.reduce(function(a, b) { return a + b }, 0); // 6 arr; //[0, 1, 2, 3] //數(shù)組扁平化 var flattened = [[0, 1], [2, 3], [4, 5]]; flattened.reduce(function(a,b){ return a.concat(b); }); // returns [0, 1, 2, 3, 4, 5]
-
indexOf() lastIndexOf() 數(shù)組檢索
用法:indexOf( searchElement, [fromIndex = 0]) / lastIndexOf( searchElement , [fromIndex = arr.length – 1])
第一個參數(shù)searchElement即需要查找的元素。第二個參數(shù)fromIndex可選宏侍,指定開始查找的位置赖淤。如果忽略,indexOf默認(rèn)是0谅河,lastIndexOf默認(rèn)是數(shù)組尾咱旱。
兩者都用于返回項(xiàng)目的索引值。區(qū)別是indexOf從頭開始找绷耍,lastIndexOf從尾開始找吐限。如果查找失敗,無匹配褂始,返回-1var arr = ['a', 'b', 'c', 'd', 'e']; arr.indexOf('c'); // 2 找到返回數(shù)組下標(biāo) arr.indexOf('c', 3); // -1 指定從3號位開始查找 arr.indexOf('f'); // -1 沒找到該元素 arr.lastIndexOf('c'); // 2 arr.lastIndexOf('c',2); // 2 arr.lastIndexOf('f'); // -1 沒找到該元素
-
isArray() 判斷是否是數(shù)組
用法:Array.isArray(value)var arr = []; var a = "not array"; Array.isArray(arr); // true Array.isArray(a); // false