創建數組
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'
字符串雖然可以像數組一樣用索引訪問元素,但是沒有數組原型上的方法。