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;
}
复制代码
【未完待续】