JavaScript權威指南之數組

創建數組

1.數組字面量

var arr = [1,2,3];

2.使用構造函數Array(創建的數組是稀疏數組,後面解釋)

var arr = new Array(10);

數組元素的讀和寫

1.數組是屬於特殊對象。
2.如果屬性是數組的索引,那麼數組將會更新其length。
3.如果使用非數字或者負數來索引數組,那麼數值會轉換爲非數組索引,當做常規對象的屬性。
4.數組的索引屬於對象屬性名的一種特殊形式。

a[-1.23] = true;  //數組擁有"-1.23"這個屬性
a["1000"] = 0;    //數組的索引
a[1.0000] = 0;    //等同於a[1]

稀疏數組

1.稀疏數組就是索引從0開始不連續的數組。
2.可以通過new Array(n)來創建稀疏數組。
3.可以通過delete數組某個索引得到稀疏數組。

empty代表不存在的值

var arr = [,,,];  //(3) [empty × 3]
var arr1 = new Array(3);  //(3) [empty × 3]
0 in arr; //false
0 in arr1; //false

var arr2 = [undefined, undefined, undefined]  //(3) [undefined, undefined, undefined]
0 in arr2; //true

所以值不存在和值爲undefined是不一樣的。
重點:如果對索引數組進行遍歷,不存在的索引不會被遍歷到。

數組長度

數組有length屬性,代表數組的元素個數。
稀疏數組,數組的length大於數組元素的個數。

var arr = [1,2,3];
Object.defineProperty(arr, 'length', {
		writable: false
	}
);		

改變數組的length,那麼就不能對數組進行增刪,只能改變已有元素的值。

數組元素的增刪

增加元素:push,unshift,返回的數組的長度

var arr = [];
arr.push(10);   //返回1(數組長度) 
arr.unshift(20);   //返回2 (數組長度)

刪除元素:pop,shift,返回的被刪除元素

var arr = [1,10,100];
arr.pop();   //返回100        
arr.shift();   //返回1

當然,數組也是對象,也可以使用delete操作符對數組元素進行刪除,但是和上面兩個方法不同的是,刪除後數組長度不變,相當於變成稀疏數組。
splice方法也能夠刪除元素,請接着往下看。

多維數組

數組中元素也是數組

var arr = [[1,2], [2,3]];

數組方法

1.Array.join():不改變原數組
參數:傳入作爲字符串爲分隔符,默認爲“,”

var arr = [1,2,3]
arr.join(); //"1,2,3"
arr.join("-"); //"1-2-3"

Strings.split()的逆向操作;
2.Array.reverse() :會改變原數組

var arr = [1,2,3];
arr.reverse(); //[3,2,1]

var arr = ['a','b','c'];
arr.reverse(); //["c","b","a"]

3.Array.sort():會改變原數組
當參數爲空的時候,按照字母表順序來排序
當參數爲函數的時候,返回大於0是升序,返回小於是降序

var arr = [2,1,3];
arr.sort(); //[1,2,3]

arr.sort((a,b) => a-b);  //[1,2,3]
arr.sort((a,b) => b-a);  //[3,2,1]

4.Array.concat():不會改變原數組

var arr = [1,2,3];
arr.concat(4,5);  //[1,2,3,4,5]
arr.concat(6,7]); //[1,2,3,4,5,6,7]

5.Array.slice():不會改變原數組
參數:起始索引,結束索引(如果索引爲負數,那就加上數組的length)
返回子數組

var arr = [1,2,3,4,5];
arr.slice(); //[1,2,3,4,5]
arr.slice(1,3); //[2,3]

5.Array.splice():會改變原數組
第一個參數表示插入或者刪除元素的索引
第二個參數表示從指定索引刪除多少個元素
後續參數表示從指定索引插入傳入的參數

var arr = [1,2,3,4,5];
arr.splice(1,2,'a','b'); //[1,'a', 'b', 4, 5]

6.toString()方法
將每個元素轉換爲字符串,(如有必要將調用每個元素的toString方法)並且輸出用逗號分隔的字符串列表。

[1,2,3].toString(); //1,2,3
[1,[2,3],4].toString(); //1,2,3,4

ES5數組方法

1.forEach()
參數:函數(數組元素,數組元素索引,數組本身)

var arr = ['a', 'b', 'c'];
arr.forEach((item, index, self) => {});

forEach方法無法在所有元素傳遞給調用函數之前提前終止。
2.map()
參數:函數(數組元素,數組元素索引,數組本身)
傳入的參數函數必須要有返回值
返回的新數組和原數組的長度相同

var arr = [1,2,3];
arr.map((item, index, self) => item * 2); //[2,4,6]

如果數組是稀疏數組,那麼返回的數組也是稀疏數組
3.filter()
參數:函數(數組元素,數組元素索引,數組本身)
傳入的參數函數返回true或者false,將返回的true的值過濾出來返回一個新數組

var arr = [1,2,3,4];
arr.filter((item, index, self) => item > 2); //[3,4]

4.every()
參數:函數(數組元素,數組元素索引,數組本身)
當且僅當所有元素傳入函數並且能夠返回true纔會返回true,如果一旦有一個返回false,那就返回false
如果一旦某個元素返回false,那麼就停止遍歷後面的元素

var arr = [1,2,3,4];
arr.every(item => item > 0);  //true
arr.every(item => item > 1);  //false

5.some()
參數:函數(數組元素,數組元素索引,數組本身)
當有元素傳入函數並且能夠返回true就會返回true,如果全部元素傳入函數都返回false,那就返回false
如果一旦某個元素返回true,那麼就停止遍歷後面的元素

var arr = [1,2,3,4];
arr.some(item => item > 3);  //true
arr.some(item => item > 4);  //false
arr.every(item => item > 1);  //false

5.reduce()和reduceRight()
第一個參數:函數,函數參數(默認值,第一個元素,第一個元素索引,數組本身)
第二個參數:傳入第一個函數第一個參數的默認值

如果第二個參數沒給,那默認值就是數組第一個元素
函數參數爲(第一個元素,第二個元素,第二個元素索引,數組本身)
函數返回的值將作爲下一個遍歷的默認值

var arr = [1,2,3,4];
arr.reduce((res,item) => res + item), 5); //15

reduceRight()和reduce()的區別就是數組索引從高到低處理。
6.indexOf()和lastIndex0f()
indexOf正向搜索給定的值,如果存在返回匹配到第一個元素的索引,否則返回-1。
lastIndexOf()反向搜索。

判斷是否爲數組

Array.isArray(arr);

//isArray函數本質上內部就是這麼判斷
Object.prototype.toString.call(arr) === '[object Array]'

類數組對象

.類數組對象不能直接使用Array.prototype上的方法
1.將類數組對象轉換爲數組,那就可以使用數組原型上的方法
2.改變數組原型上方法this的指向
Array.prototype.slice.call(arr);

作爲數組的字符串

var str = 'xiaoming';
str[1] = 'i';
str.charAt(1); //'i'

字符串雖然可以像數組一樣用索引訪問元素,但是沒有數組原型上的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章