經常使用方法:javascript
// 字面量
var arr = [1,2,3]; // [1,2,3]
// 構造方式
var arr = Array(); // []
var arr = Array(1,2,3); // [1,2,3]
var arr = Array(3); //[,,]
複製代碼
通常的, new Array === Array, 因此加不加new並無很大的影響。java
ES6 新增方法:面試
let arr = Array.of(1,2,3); // [1,2,3]
複製代碼
Array.from() 將參數對象轉換爲數組,不改變原對象,而是返回一個新的數組對象數組
對象的要求:函數
參數:ui
let a = {0: '1', 1: '2', 2: '3', 'length': 3};
let arr = Array.from(a); //['1','2','3']
// 字符串
let arr = Array.from('array'); //['a','r','r','a','y']
// Set、Map
let arrset = Array.from(new Set(['func', window])); //['func', window]
let arrMap = Array.from(new Map([1,2],[3,4],[5,6])); // [[1,2], [3,4],[5,6]]
// 類 map 方法的使用
let theArr = Array.from([1,2,3], x => ++x); // [2,3,4]
複製代碼
數組有多種方法,下面我將一一經過舉例等爲你們講解以及場景應用:this
arr.splice(index, num, item1, item2, ...);spa
參數介紹:code
返回值:若是是刪除操做,那麼會把刪除的元素放在一個新數組中返回。對象
使用場景:
let arr = [1,2,3,4,5];
// 刪除 arr 的前三個元素
let before = arr.splice(0,3); //[1,2,3]
// 此時 arr 爲 [4,5]
// 刪除 arr 的最後一位元素
let after = arr.splice(-1,1); //[5], 注意,此時最後一位以後只有一個元素,後一位無論寫多大都只會是最後一位元素被刪除並返回
// 此時 arr 爲 [4]
複製代碼
let arr = [1,2,3,4,5];
let addFromStart = arr.splice(0,0,0); // [] 沒有刪除,因此這裏返回的是空數組
console.log(arr); // [0,1,2,3,4,5]
let addFromEnd = arr.splice(-1,0,6); // []
console.log(arr); // [0,1,2,3,4,6,5] !!! 注意,是從最後一位開始向前添加元素,因此 6 在 5 前。
複製代碼
let arr = [1,2,3,4,5];
let arrAddAndDelete = arr.splice(0,2,100); //[1,2]
console.log(arr); //[100,3,4,5]
複製代碼
特色:
1.操做的元素會包括開始的元素。
2.若是數組的元素不夠,會一直刪除到最後一個數組。
arr.pop();
無參數
返回值: 被刪除的元素
使用場景:
let arr = [1,2,3];
let deleteItem = arr.pop(); // 3
console.log(arr); //[1,2]
複製代碼
arr.shift();
無參數
返回值: 被刪除的元素
使用場景:
let arr = [1,2,3];
let deleteItem = arr.shift(); // 1
console.log(arr); // [2,3]
複製代碼
arr.push(item1,item2, item3,...);
參數: 向數組末尾添加的元素
返回值:添加後數組的 length
使用場景:
let a = [1,2,3];
let theLength = a.push(4); // 4
console.log(a); // [1,2,3,4]
複製代碼
arr.unshift(item1,item2,...);
參數: 向數組開頭添加的元素
返回值:添加後數組的 length
使用場景:
let a = [1,2,3];
let theLength = a.unshift(0); // 4
console.log(a); // [0,1,2,3]
複製代碼
arr.sort(func)
對數組進行排序,以後返回這個數組
參數:規定排序順序的比較函數(非必須)
傳入函數的參數:兩個默認參數,非別是要比較的兩個元素(後面用a,b指示),而且排序順序主要跟函數的返回值有關,若返回值 小於0
, 則 a 在 b 以前;若返回值等於0
, 則a,b位置不變;若返回值大於0
,則 b 在 a 以前。
返回值: 排序後的數組
使用場景:
默認狀況下,不傳參數的話,默認按字母升序,若爲非字符串,則先調用toString()
將元素轉化爲字符串的 Unicode ,再進行字符串比較.因此,默認的sort()
不適合用來比較數字等。
let arr = ["A","C","B","E","D"];
arr.sort();
console.log(arr); //["A","B","C","E","D"]
複製代碼
數組的升序與降序排序
let arr = [9,15,35,21,42,2,7];
// 升序操做, 若 a < b, 則 a - b 小於 0, a將排在b以前
arr.sort((a,b) => a-b);
console.log(arr); //[2, 7, 9, 15, 21, 35, 42]
// 降序操做, 若 a < b, 則 b - a 大於 0, a排在b以後
arr.sort((a,b) => b-a);
console.log(arr); // [42, 35, 21, 15, 9, 7, 2]
複製代碼
複雜條件(自定義)判斷
// 按年齡排序,若年齡相同,就女士(sex屬性爲0) 排在男士(sex屬性爲1)以前。
let arr = [{age: 18, sex: 0}, {age: 19, sex: 0}, {age: 20, sex: 0}, {age: 18, sex: 1}, {age: 19, sex: 1}];
arr.sort((a,b) => {
if (a.age === b.age) { //若年齡相同就按性別排,女士優先
return a.sex - b.sex;
} else { //年齡不相同就默認按年齡排升序
return a.age - b.age;
}
})
console.log(arr); //[{age: 18, sex: 0}, {age: 18, sex: 1}, {age: 29, sex: 0}, {age: 19, sex: 1}, {age: 20, sex: 0}];
複製代碼
arr.reverse();
無參數
無返回值
使用場景:
let arr = [1,2,3];
arr.reverse();
console.log(arr); [3,2,1]
複製代碼
arr.copyWithin(index, start, end)
參數:
無返回值
使用場景:
let arr = [1,2,3,4,5];
arr.copyWithin(0,2,4); //複製了幾個元素,就替代幾個元素
console.log(arr); // [3,4,3,4,5]
複製代碼
arr.fill(value, start, end)
參數:
無返回值
使用場景:
let arr = new Array(3);
arr.fill(1);
console.log(arr); //[1,1,1]
arr.fill(2,1,3);
console.log(arr); //[1,2,2]
複製代碼
arr.slice(start, end);
參數:
返回值: 複製後的新數組
使用場景:
複製簡單數據類型
let a = [1,2,3];
let b = a.slice(0,2);
console.log(a,b); //[1,2,3] [1,2]
// 淺拷貝,複製簡單數據類型,以後進行操做不會互相干擾。
a[0] = 100;
console.log(a,b); // [100, 2, 3] [1, 2]
b[0] = 200;
console.log(a,b); // [100, 2, 3] [200, 2]
複製代碼
複製複雜引用類型
let a = [{id:1,num:5}];
let b = a.slice();
console.log(a,b); //[{id:1,num:5}] [{id:1,num:5}]
// 淺拷貝,複製複雜引用類型,以後進行操做會相互干擾。由於複製的只是對象的指向,而不是複製一個副本。
a[0].id = 2;
console.log(a,b); //[{id:2,num:5}] [{id:2,num:5}]
b[0].num++;
console.log(a,b); //[{id:2,num:6}] [{id:2,num:6}]
複製代碼
arr.join(str);
參數: str(可選): 用來做爲指定的分隔符,默認爲逗號。
返回值:返回轉換後的字符串。
使用場景:
let a = [1,2,3];
let str = a.join();
console.log(str); // "1,2,3"
let anotherStr = a.join('-');
console.log(anotherStr); //"1-2-3"
複製代碼
注意,當數組中爲對象時,join
方法會默認打出 [object object]
arr.toString() / arr.toLocaleString();
無參數
返回值:轉換後的字符串。
兩個與join
有點相似,只是 toLocaleString
至關於先調用數組元素的 toLocaleString
方法以後再進行join
,toString()
用逗號隔開數組元素拼接爲字符串。
使用場景:
let arr = [1,2,3];
let arrStr = arr.toString();
console.log(arrStr); //"1,2,3"
let arrLocale = [new Date(),1,2];
let LocaleStr = arrLocale.toLocaleString();
console.log(LocaleStr); //"2019/4/16 下午5:05:43,1,2"
複製代碼
arr.concat(arr1,arr2,arr3);
參數: arr1,arr2,arr3: 須要合併的數組,也能夠直接爲值。
返回值:合併後的新數組。
使用場景:
let arr = [1,2,3];
let arr1 = [4,5];
let afterArr = arr.concat(arr1);
console.log(afterArr); //[1, 2, 3, 4, 5]
console.log(arr); //[1, 2, 3]
console.log(arr1); //[4, 5]
複製代碼
關於合併數組咱們還可使用 ...
ES6 提供的擴展運算符來合併
let arr = [1,2,3];
let arr1 = [...arr,4,5]; // [1,2,3,4,5]
複製代碼
arr.indexOf(value, fromIndex);
參數:
返回值:
注意!!! indexOf
使用的是嚴格相等(===
),不存在隱式類型轉換。
let arr = [1,2,3];
console.log(arr.indexOf(1)); // 0
console.log(arr.indexOf(1,1)); // -1
console.log(arr.indexOf(4)); // -1
複製代碼
arr.lastIndexOf(value, fromIndex);
參數:
返回值: 元素的最後一個位置。
let arr = [1,2,3,2,1];
console.log(arr.lastIndexOf(1)); // 4
console.log(arr.lastIndexOf(2)); // 3
複製代碼
arr.includes(value);
參數:
返回值:布爾型
與indexOf
的區別:
NaN
,但 includes 能夠。let arr = [1,NaN, 100,'42'];
console.log(arr.includes(1)); //true
console.log(arr.includes(NaN)); //true
console.log(arr.includes(1,3)); //false
複製代碼
arr.forEach(function(value, index, arr), this);
參數:
返回值:無
一些特色:
let arr = [1,2,3,4, ,5 ];
const obj = {name: 'obj'};
arr.forEach(function(value, index,array) {
arr[4] = 'edited'; // 改變空元素的值,傳遞給回調的是遍歷到這一刻的值
arr.push(6); //新添加的元素,不會被遍歷到。
console.log(value, index);
console.log(this.name); // "obj"
}, obj); // 用來讓回調函數內的this指向obj
複製代碼
arr.some(function(value, index, arr), this);
參數:
返回值:布爾類型 ture
or false
let arr = [1,2,3,4,5];
let result1 = arr.some((value) => value > 6); //false
let result2 = arr.some((value) => value < 2); //true
複製代碼
arr.some(function(value, index, arr), this);
參數:
返回值:布爾類型 ture
or false
let arr = [1,2,3,4,5];
let result1 = arr.every((value) => value > 6); //false
let result2 = arr.every((value) => value < 6); //true
複製代碼
arr.filter(function(value,index,arr), this);
參數:
返回值: 新的數組。
let arr = [1,2,3,4,5];
// 只獲取數組中大於2的元素,並放入一個新數組中
let result = arr.filter(item => item > 2);
console.log(result); //[3,4,5]
複製代碼
arr.map(function(value, index, arr), this);
map 遍歷的回調內必需要有一個返回值,必定要注意。
參數:
返回值: 新的數組。
let arr = [1,2,3,4,5];
// 數組元素變爲原來的2倍
let result = arr.map(item => item * 2);
console.log(result); //[2, 4, 6, 8, 10]
複製代碼
arr.reduce((total, value, index, arr), init)
參數:
返回值:累加後的值。
let arr = [1,2,3,4];
let sum = arr.reduce((total,value) => total + value ); //10
複製代碼
arr.find(function(value, index, arr), this);
參數:
返回值: find()返回第一個符合條件的數組成員,若不存在返回undefined
。 findIndex()返回符合條件的數組成員的索引。
let arr = [1,2,3,4];
let result1 = arr.find((value) => value > 3);
console.log(result1);//4
let result2 = arr.findIndex((value) => value > 3);
console.log(result2); //3
複製代碼
arr.flat(depth);
參數: depth(可選): 提取嵌套數組的結構深度,默認爲1。
返回值:展開後的新數組。
let arr = [1,2,[3,4,[5,6]]]
let one = arr.flat();
console.log(one); //默認值爲1, 因此只能展開一層嵌套 [1,2,3,4,[5,6]]
let two = arr.flat(2);
console.log(two); //[1,2,3,4,5,6]
// 若不清楚有多少層嵌套,能夠直接用 Infinity 設置,就可所有展開
let inf = arr.flat(Infinity);
console.log(inf); //[1,2,3,4,5,6]
// flat方法會移除數組中的空白項
let arr2 = [1,2,3,,5];
console.log(arr2.flat()); //[1,2,3,5]
複製代碼
分享一個能夠用這個解決的面試題,仍是經過這道題發現原來有flat
這個方法 :joy:
題目: 將一個多維數組扁平化並去重,以後獲得一個升序數組。
let arr = [1,2,3,4,5,[2,4,5,8,[44,88,1,3,4,8,5,7,6,[123],111],15],2,8,7];
let newArr = Array.from(new Set(arr.flat(Infinity))).sort((a,b) => a - b)
console.log(newArr); //[1, 2, 3, 4, 5, 6, 7, 8, 15, 44, 88, 111, 123]
複製代碼
arr.keys() / arr.values() / arr.entries()
無參數
返回值: 一個可遍歷的數組對象[Array Iterator],因此咱們是不能夠直接打印這個對象的,而是能夠遍歷它。
let arr = [9,8,7,6,5,4,3,2,1]
for(let index of arr.keys()){
console.log(index); //0,1,2,3,4...依次打印
}
for(let value of arr.values()){
console.log(value); //9,8,7,6,5....依次打印
}
for(let [index, value] of arr.entries()){
console.log(index,value); // 0,9 1,8 2,7
}
複製代碼
固然也能夠手動調用遍歷器
let arr =["one","two","three"];
let result = arr.entries();
console.log(result.next().value); //[0, "one"]
console.log(result.next().value); //[1,"two"]
console.log(result.next().value); //[2, "three"]
複製代碼
以前一直用數組有關方法的時候感受老是隻能想起一些經常使用的,有時用一些數組方法還要去確認了文檔才能開始使用,感受數組的有些方法仍是須要有個系統的認知,能夠將一些更高效的原生方法應用在開發中。
若對文中部份內容有異議,歡迎在評論區討論!
[ECMAScript 6 入門](