创建数组
es5构造函数创建数组
let items = new Array(2);console.log(items.length); //2console.log(items[0]); //undefinedconsole.log(items[1]); //undefineditems = new Array(2);console.log(items.length); //1console.log(items[0]); //"2"items = new Array(1, 2);console.log(items.length); //2console.log(items[0]); //1console.log(items[1]); //2items = new Array(3, "2");console.log(items.length); //2console.log(items[0]); //3console.log(items[1]); // "2"
如果给Array构造函数传入一个数值型的值,那么数组的length属性会被设为该值;如果传入多个值,此时无论这些值是不是数值型的,都会变为数组的元素。这个特性令人感到困惑,你不可能总是注意传入数据的类型,所以存在一定的风险。
Array.of()
es6创建数组
let items = Array.of(1, 2);console.log(items.length); //2console.log(items[0]); // 1console.log(items[1]); // 2items = Array.of(2);console.log(items.length); //1console.log(items[0]); // 2items = Array.of("2");console.log(items.length); //1console.log(items[0]); //"2"
es5类数组转数组
方法一:遍历类数组,push进新数组
function makeArray(arrayLike) {var result = [];for (var i = 0, len = arrayLike.length; i < len; i++) {result.push(arrayLike[i]);}return result;}function doSomething() {var args = makeArray(arguments);//使用args;}
方法二:Array.prototype.slice.call(类数组)
function makeArray(arrayLike) {return Array.prototype.slice.call(arrayLike);}function doSomething() {var args = makeArray(arguments);//使用args}
Array.from()
es6类数组转数组
function doSomething() {var args = Array.from(arguments);// 使用args}
映射转换
Array.from第二个参数可以设置成一个函数 将数组中的每一个值进行操作
function translate() {return Array.from(arguments, (value) => value + 1);}let numbers = translate(1, 2, 3);console.log(numbers); //[2,3,4]
Array.from第三个参数可以设置绑定this
let helper = {diff: 1,add(value) {return value + this.diff;}};function translate() {return Array.from(arguments, helper.add, helper);}let numbers = translate(1, 2, 3);console.log(numbers); //[1,2,3]
用Array.from()转换可迭代对象
Array.from()方法可以处理类数组对象和可迭代对象,也就是说该方法能够将所有含有Symbol.iterator属性的对象转换为数组,例如:
let numbers = {*[Symbol.iterator]() {yield 1;yield 2;yield 3;}}let numbers2 = Array.from(numbers, (value) => value + 1);console.log(numbers2); //[1,2,3]
为所有数组添加的新方法
find() 与 findIndex()
find()方法和findIndex()方法都接受两个参数:一个是回调函数;另一个是可选参数,用于指定回调函数中this的值
回调函数参数:(数组元素)elem,(当前元素的索引)index,(数组本身)array 与forEach() map() 方法相同
二者唯一的区别 find()方法返回查找到的值,findIndex()方法返回找到值的索引
let numbers = [25, 30, 35, 40, 45];console.log(numbers.find(n => n > 33)); //35console.log(numbers.findIndex(n => n > 33)); //2
如果要在数组中根据某个条件查找匹配的元素,那么find()方法和findIndex()方法可以很好地完成任务;
如果只想查找与某个值匹配的元素,则indexOf()方法和lastIndexOf()方法是更好的选择。
fill()方法
fill()方法可以用指定的值填充一至多个数组元素。当传入一个值时,fill()方法会用这个值重写数组中的所有值,例如:
参数:重写替换的数字,[开始索引 ,结束索引)
let numbers = [1, 2, 3, 4];
numbers.fill(1);
console.log(numbers); //[1, 1, 1, 1]
let numbers = [1, 2, 3, 4];
numbers.fill(1,2);
console.log(numbers);//[1,2,1,1]
numbers.fill(1,1,3);
console.log(numbers); //[1, 1, 1, 1]
注:如果开始索引或结束索引为负值,那么这些值会与数组的length属性相加来作为最终位置。例如,如果开始位置为-1,那么索引的值实际为array.length -1,array为调用fill()方法的数组。
copyWithin()方法
从数组中复制元素的值
参数:开始填充值的索引位置,[开始复制值的索引位置,停止复制值的位置)
let numbers = [1, 2, 3, 4];
// 从数组的索引2开始粘贴值,从数组的索引0开始复制值
numbers.copyWithin(2, 0);
console.log(numbers.toString()); //1,2,1,2
let numbers = [1, 2, 3, 4];
// 从数组的索引2开始粘贴值,从数组的索引0开始复制值,到索引0结束
numbers.copyWithin(2, 0, 1);
console.log(numbers.toString()); //1,2,1,4
定型数组
暂时略
rrayBuffer对象、TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011 年 2 月发布),ES6 将它们纳入了 ECMAScript 规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。
这个接口的原始设计目的,与 WebGL 项目有关。所谓 WebGL,就是指浏览器与显卡之间的通信接口,为了满足 JavaScript 与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。
小结
ECMAScript 6延续了ECMAScript 5的传统,进一步强化了数组功能。新增的特性包括两种创建数组的新方法:Array.of()和Array.from()。Array.from()方法也可以将可迭代对象和类数组对象转换为数组。这两个方法都通过派生数组类继承,并通过Symbol.species属性来决定返回值的数据类型(其他继承方法在返回数组时同样也用到了Symbol.species)。
此外,还介绍了几种新的数组方法。fill()方法和copyWithin()方法可以更改数组中特定位置的元素值;find()方法和findIndex()方法可以用于在数组中查找匹配某些标准的第一个元素,find()方法返回匹配规则的第一个元素,findIndex()方法返回该元素的索引值。
严格来讲定型数组不是数组,因为它们不继承自Array,但它们确实看起来很像数组,行为也很像数组。定型数组中的值属于8种不同数值数据类型中的一个,它们是基于ArrayBuffer对象构建的,用于表示一个或多个数字底层的数位。按位运算更适合用定型数组来操作,因为其不会像JavaScript数字类型的操作那样将值在多种格式间反复转换。
