JavaScript數組也是對象,它使用單一的變量存儲一系列的值。es6
在JavaScript中,數組必須使用數字索引,對象可使用命名索引。 數組是特殊類型的對象,具備特有的一些屬性和方法。數組
方案1 ECMAScript5定義新方法Array.isArray()瀏覽器
var arr = [];
var obj = {};
console.log(Array.isArray(arr));
// true
console.log(Array.isArray(obj));
// false
複製代碼
此方案不支持老的瀏覽器。數據結構
方案2app
var arr = [];
console.log(Object.prototype.toString.call(arr));
// [object Array]
var obj = {};
console.log(Object.prototype.toString.call(obj));
// [object Object]
複製代碼
使用字面量建立dom
var arr = [];
複製代碼
使用構造函數建立函數
var arr = new Array();
console.log(arr);
// []
arr = new Array(2);
console.log(arr);
// [empty × 2],當構造函數只傳一個參數時如2,生成一個長度爲2,都爲空位的數組
arr = new Array(1, 2);
console.log(arr);
// [1, 2]
複製代碼
出於簡潔、可讀性和執行速度的考慮,建議使用第一種方法。測試
var arr = [1, 2];
console.log(arr[1]);// 2
複製代碼
var arr = [1, 2];
arr[1] = 3;
console.log(arr);
// [1, 3]
複製代碼
var arr = [1, 2];
arr[3] = 3;
console.log(arr);
// [1, 2, empty, 3]
console.log(arr[4]);
// undefined
複製代碼
數組屬於對象,因此可使用delete運算符執行刪除操做ui
var arr = [0];
console.log(arr);
// [0]
delete arr[0];
console.log(arr);
// [empty]
複製代碼
var arr = [1, 2];
console.log(arr.length);
// 2
複製代碼
var arr = [1, 2];
for (var i = 0, len = arr.length; i < len; i ++) {
console.log(arr[i]);
}
// 1
// 2
複製代碼
var arr = [1, 2];
for (index in arr) {
console.log(arr[index]);
}
// 1
// 2
複製代碼
var arr1 = [1];
var arr2 = [2];
console.log(arr1.concat(arr2));
// [1, 2]
var arr = [1];
console.log(arr.concat(2, 3));
// [1, 2, 3]
複製代碼
不會改變原數組this
var arr = [1, 2];
console.log(arr.join('-'));
// 1-2
複製代碼
不會改變原數組
var arr = [1, 2];
console.log(arr.sort());
// [1, 2]
console.log(arr.sort((item1, item2) => {
return item1 - item2;
}));
// [1, 2]
console.log(arr.sort((item1, item2) => {
return item2 - item1;
}));
// [2, 1]
console.log(arr);
// [2, 1]
複製代碼
返回對數組的引用,在原數組上進行排序,不生成副本。 說明
return item1 - item2
爲升序,反之return item2 - item1
爲降序。因此return 0.5 - Math.random()
能夠實現隨機排序。方案一 查找最小值(最大值同理)
var arr = [1, 2];
console.log(arr.sort(function (a, b) {
return a - b;
})[0]);
複製代碼
須要對數組進行排序,效率較低 方案二
var arr = [1, 2];
function getArrMax(arr) {
return Math.max.apply(null, arr);
}
function getArrMin(arr) {
return Math.min.apply(null, arr);
}
console.log(getArrMax(arr));
// 2
console.log(getArrMin(arr));
// 1
複製代碼
var arr = [1, 2];
console.log(arr.pop());
// 2
console.log(arr);
// [1]
複製代碼
會改變原數組
var arr = [1, 2];
console.log(arr.push(3));
// 3
console.log(arr);
// [1, 2, 3]
複製代碼
會改變原數組 push()方法和pop()方法使用數組提供的先進後出棧的功能。
var arr = [1, 2];
console.log(arr.reverse());
// [2, 1]
複製代碼
會改變原數組
var arr = [1, 2];
console.log(arr.shift());
// 1
console.log(arr);
// [2]
複製代碼
會改變原數組
var arr = [1];
console.log(arr.unshift(3));
// 2
console.log(arr);
// [3, 1]
複製代碼
改變原有的數組
arrayObject.slice(start,end)
複製代碼
start、end均可以使用負值從數組的尾部選取元素,
var arr = [1, 2, 3];
console.log(arr.slice(1, 2));
// [2]
console.log(arr);
// [1, 2, 3]
複製代碼
不會改變原數組,若是須要刪除數組中的一段元素,應該使用方法Array.splice()
arrayObject.splice(index,howmany,item1,.....,itemX)
複製代碼
howmany若是設置爲0,則不會刪除項目。
var arr = [1, 2, 3, 4, 5];
console.log(arr.splice(2, 1, 6));
// [3]
console.log(arr);
// [1, 2, 6, 4, 5]
複製代碼
改變原始數組。
var arr = [1, 2, 3];
console.log(arr.toString());
// 1,2,3
複製代碼
返回值與沒有參數的join()方法返回的字符串相同,元素之間用逗號分隔
首先調用每一個數組元素的toLocaleString()方法,而後使用地區特定的分隔符把生成的字符串鏈接起來,造成一個字符串。
var arr = ['a', 'b', 'c'];
console.log(arr.toLocaleString());
// a,b,c
複製代碼
var arr = [1, 2];
console.log(arr.valueOf());
// [1, 2]
複製代碼
一般由JavaScript在後臺自動調用,並不顯式地出如今代碼中。
var arr = [1, 2];
arr.forEach(function (item, index, arr) {
console.log(item);
console.log(index);
console.log(arr);
});
// 1
// 0
// [1, 2]
// 2
// 1
// [1, 2]
複製代碼
不改變原數組
var arr = [1, 2];
console.log(arr.map(function (item, index, array) {
return item * 2;
}));
// [2, 4]
console.log(arr);
// [1, 2]
複製代碼
不改變原數組
var arr = [1, 2];
console.log(arr.filter(function (item, index, array) {
return item > 1;
}));
// [2]
console.log(arr);
// [1, 2]
複製代碼
不改變原數組
var arr = [1, 2, 3];
var sum = arr.reduce(function (total, value, index, array) {
return total + value;
});
console.log(sum);
// 6
console.log(arr);
// [1, 2, 3]
複製代碼
能夠接受一個初始值
var arr = [1, 2, 3];
var sum = arr.reduce(function (total, value, index, array) {
return total + value;
}, 4);
console.log(sum);
// 10
console.log(arr);
// [1, 2, 3]
複製代碼
var arr = [1, 2, 3];
var sum = arr.reduceRight(function (total, value, index, array) {
return total + value;
}, 4);
console.log(sum);
// 10
console.log(arr);
// [1, 2, 3]
複製代碼
var arr = [1, 2, 3];
console.log(arr.every(function (value, index, array) {
return value < 3;
}));
// false
複製代碼
var arr = [1, 2, 3];
console.log(arr.some(function (value, index, array) {
return value < 3;
}));
// true
複製代碼
array.indexOf(item, start)
複製代碼
item 必需。要檢索的項目。 start 可選。從哪裏開始搜索。負值將從結尾開始的給定位置開始,並搜索到結尾。
未找到項目返回-1。 項目屢次出現,返回第一次出現的位置。
var arr = [1, 2, 3];
console.log(arr.indexOf(2));
// 1
複製代碼
array.lastIndexOf(item, start)
複製代碼
item 必需。要檢索的項目。 start 可選。從哪裏開始搜索。負值將從結尾開始的給定位置開始,並搜索到開頭。
var arr = [1, 2, 3];
console.log(arr.lastIndexOf(2));
// 1
複製代碼
var arr = [1, 2, 3];
console.log(arr.find(function (value, index, array) {
return value > 1;
}));
// 2
複製代碼
var arr = [1, 2, 3];
console.log(arr.findIndex(function (value, index, array) {
return value > 1;
}));
// 1
複製代碼
所謂相似數組的對象,本質特徵只有一點,即必須有length屬性。
var arrLike = {
"0": 1,
"1": 2,
length: 2,
};
// ES5的寫法
console.log([].slice.call(arrLike));
// [1, 2]
// ES6的寫法
console.log(Array.from(arrLike));
// [1, 2]
複製代碼
只要部署了Iterator接口的數據結構,Array.from都能將其轉爲數組,如Set和Map。
var set = new Set([1, 2])
console.log(Array.from(set));
// [1, 2]
複製代碼
Array.from還能夠接受第二個參數,做用相似於數組的map方法。
var arrLike = {
"0": 1,
"1": 2,
length: 2,
};
console.log(Array.from(arrLike, value => value *2));
// [2, 4]
複製代碼
若是map函數裏面用到了this關鍵字,還能夠傳入Array.from的第三個參數,用來綁定this。
var arrLike = {
"0": 1,
"1": 2,
length: 2,
};
var context = {
key: 1,
}
console.log(Array.from(arrLike, function () { return this.key *2 }, context));
// [2, 2]
複製代碼
console.log(Array.of(1, 2));
// [1, 2]
console.log(Array.of(2));
// [2]
複製代碼
參數個數不一樣,不會有像new Array()同樣行爲有差別。
Array.of()的模擬實現
function ArrayOf(){
return [].slice.call(arguments);
}
複製代碼
Array.prototype.copyWithin(target, start = 0, end = this.length)
複製代碼
var arr = [1, 2, 3, 4, 5];
console.log(arr.copyWithin(0, 3));
// [4, 5, 3, 4, 5]
console.log(arr);
// [4, 5, 3, 4, 5]
複製代碼
arr.fill(value, start, end);
複製代碼
console.log([1, 2, 3].fill(4, 1, 2));
// [1, 4, 3]
複製代碼
keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。
for (let index of [1, 2].keys()) {
console.log(index);
}
// 0
// 1
for (let value of [1, 2].values()) {
console.log(value);
}
// 1
// 2
for (let [index, value] of [1, 2].entries()) {
console.log(index, value);
}
// 0 1
// 1 2
複製代碼
Array.prototype.includes(value, start);
複製代碼
該方法的第二個參數表示搜索的起始位置。
console.log([1, 2, 3].includes(3, 3));
// false
console.log([1, 2, 3].includes(3, -1));
// true
複製代碼
includes不會致使對NaN的誤判
console.log([1, 2, [3, 4]].flat());
// [1, 2, 3, 4]
console.log([1, 2, [3, [4, 5]]].flat(1));
// [1, 2, 3, Array(2)]
console.log([1, 2, [3, [4, 5]]].flat(2));
// [1, 2, 3, 4, 5]
複製代碼
flat()的參數表明「拉平」幾層的嵌套數組,使用Infinity關鍵字,無論多少層嵌套,均可以轉成一維數組。
arr.flatMap(function callback(currentValue, index, array) {
// ...
}, thisArg)
複製代碼
console.log([2, 3, 4].flatMap((x) => [x, x * 2]));
// [2, 4, 3, 6, 4, 8]
複製代碼
只能展開一層數組。
console.log([1, 2, 3, 4].flatMap(x => [[x * 2]]));
// [[2], [4], [6], [8]]
複製代碼