new Array() 構造器正則表達式
改變自身的方法:算法
不改變自身的方法:數組
新增方法:瀏覽器
Array.of()、Array.from() 構造函數方法數據結構
改變自身的方法:app
不改變自身的方法:函數
可使用 for ... of 遍歷數組ui
Array.of() 用於將參數依次轉化爲數組中的一項,而後返回這個新數組,而無論這個參數是數字仍是其它。它基本上與Array構造器功能一致,惟一的區別就在單個數字參數的處理上。以下:this
Array.of(8.0); // => [8]
Array(8.0); // => [undefined × 8]
複製代碼
參數爲多個,或單個參數不是數字時,Array.of() 與 Array 構造器等同。spa
Array.of(8.0, 5); // => [8, 5]
Array(8.0, 5); // => [8, 5]
Array.of('8'); // => ['8']
Array('8'); // => ["8"]
複製代碼
Array.from() 用於將兩類對象轉爲真正的數組:相似數組的對象(array-like object)和可遍歷(iterable)的對象(包括 ES6 新增的數據結構 Set 和 Map)。所謂相似數組的對象,本質特徵只有一點,即必須有length屬性。 注意:
新增方法:
var array = [NaN];
console.log(array.includes(NaN)); // => true
console.log(array.indexOf(NaN)>-1); // => false
複製代碼
var a = [];
// 1.基於instanceof
a instanceof Array;
// 2.基於constructor
a.constructor === Array;
// 3.基於Object.prototype.isPrototypeOf
Array.prototype.isPrototypeOf(a);
// 4.基於getPrototypeOf
Object.getPrototypeOf(a) === Array.prototype;
// 5.基於Object.prototype.toString
Object.prototype.toString.apply(a) === '[object Array]';
複製代碼
以上,除了Object.prototype.toString外,其它方法都不能正確判斷變量的類型。
要知道,代碼的運行環境十分複雜,一個變量可能使用渾身解數去迷惑它的創造者。且看:
var a = {
__proto__: Array.prototype
};
// 分別在控制檯試運行如下代碼// 1.基於instanceof
a instanceof Array; // => true
// 2.基於constructor
a.constructor === Array; // => true
// 3.基於Object.prototype.isPrototypeOfArray.prototype.isPrototypeOf(a); // => true
// 4.基於getPrototypeOf
Object.getPrototypeOf(a) === Array.prototype; // => true
複製代碼
以上,4種方法將所有返回true,爲何呢?咱們只是手動指定了某個對象的__proto__屬性爲Array.prototype,便致使了該對象繼承了Array對象,這種絕不負責任的繼承方式,使得基於繼承的判斷方案瞬間土崩瓦解。
不只如此,咱們還知道,Array是堆數據,變量指向的只是它的引用地址,所以每一個頁面的Array對象引用的地址都是不同的。iframe中聲明的數組,它的構造函數是iframe中的Array對象。若是在iframe聲明瞭一個數組x,將其賦值給父頁面的變量y,那麼在父頁面使用y instanceof Array ,結果必定是false的。而最後一種返回的是字符串,不會存在引用問題。實際上,多頁面或系統之間的交互只有字符串可以暢行無阻。
缺點:
function isArray(){
return Object.prototype.toString.call(value) == "[object Array]"
}
複製代碼
一樣思路能夠用來檢測某個值是否是 原生函數 或 正則表達式:
function isFunction(){
return Object.prototype.toString.call(value) == "[object Function]"
}
function isRegExp(){
return Object.prototype.toString.call(value) == "[object RegExp]"
}
複製代碼
環境要求:IE9+
Array.isArray([]); // => true
Array.isArray({0: 'a', length: 1}); // => false
複製代碼
如a = [1, 2, 3, 2],指望獲得b = [1, 3]
a.filter(v=> a.indexOf(v) === a.lastIndexOf(v))
複製代碼
各瀏覽器的針對 sort() 方法內部算法實現不盡相同,排序函數儘可能只返回-一、0、1三種不一樣的值,不要嘗試返回 true 或 false 等其它數值,由於可能致使不可靠的排序結果。
let arr = [10, 1, 3, 20];
arr.sort((a,b)=>a-b)
複製代碼
如:a = [1, 2, 3, 4], b = [3, 4, 5, 5], 指望獲得c = [1, 2, 5, 5]
let temp = a.filter(v=>b.includes(v));
let c = [...a,...b].filter(v=> !temp.includes(v))
複製代碼
生成一個從0到指定數字的新數組
Array.from({length: 10}, (v, i) => i); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
複製代碼
將字符串轉爲數組,而後返回字符串的長度。 由於 Array.from 能正確處理各類 Unicode 字符,能夠避免 JavaScript 將大於\uFFFF的 Unicode 字符,算做兩個字符的 bug。
function countSymbols(string) {
return Array.from(string).length;
}
複製代碼
【未完待續】