创建数组


es5构造函数创建数组

  1. let items = new Array(2);
  2. console.log(items.length); //2
  3. console.log(items[0]); //undefined
  4. console.log(items[1]); //undefined
  5. items = new Array(2);
  6. console.log(items.length); //1
  7. console.log(items[0]); //"2"
  8. items = new Array(1, 2);
  9. console.log(items.length); //2
  10. console.log(items[0]); //1
  11. console.log(items[1]); //2
  12. items = new Array(3, "2");
  13. console.log(items.length); //2
  14. console.log(items[0]); //3
  15. console.log(items[1]); // "2"

如果给Array构造函数传入一个数值型的值,那么数组的length属性会被设为该值;如果传入多个值,此时无论这些值是不是数值型的,都会变为数组的元素。这个特性令人感到困惑,你不可能总是注意传入数据的类型,所以存在一定的风险。

Array.of()

es6创建数组

  1. let items = Array.of(1, 2);
  2. console.log(items.length); //2
  3. console.log(items[0]); // 1
  4. console.log(items[1]); // 2
  5. items = Array.of(2);
  6. console.log(items.length); //1
  7. console.log(items[0]); // 2
  8. items = Array.of("2");
  9. console.log(items.length); //1
  10. console.log(items[0]); //"2"


es5类数组转数组
方法一:遍历类数组,push进新数组

  1. function makeArray(arrayLike) {
  2. var result = [];
  3. for (var i = 0, len = arrayLike.length; i < len; i++) {
  4. result.push(arrayLike[i]);
  5. }
  6. return result;
  7. }
  8. function doSomething() {
  9. var args = makeArray(arguments);
  10. //使用args;
  11. }

方法二:Array.prototype.slice.call(类数组)

  1. function makeArray(arrayLike) {
  2. return Array.prototype.slice.call(arrayLike);
  3. }
  4. function doSomething() {
  5. var args = makeArray(arguments);
  6. //使用args
  7. }


Array.from()

es6类数组转数组

  1. function doSomething() {
  2. var args = Array.from(arguments);
  3. // 使用args
  4. }

映射转换

Array.from第二个参数可以设置成一个函数 将数组中的每一个值进行操作

  1. function translate() {
  2. return Array.from(arguments, (value) => value + 1);
  3. }
  4. let numbers = translate(1, 2, 3);
  5. console.log(numbers); //[2,3,4]

Array.from第三个参数可以设置绑定this

  1. let helper = {
  2. diff: 1,
  3. add(value) {
  4. return value + this.diff;
  5. }
  6. };
  7. function translate() {
  8. return Array.from(arguments, helper.add, helper);
  9. }
  10. let numbers = translate(1, 2, 3);
  11. console.log(numbers); //[1,2,3]

用Array.from()转换可迭代对象
Array.from()方法可以处理类数组对象和可迭代对象,也就是说该方法能够将所有含有Symbol.iterator属性的对象转换为数组,例如:

  1. let numbers = {
  2. *[Symbol.iterator]() {
  3. yield 1;
  4. yield 2;
  5. yield 3;
  6. }
  7. }
  8. let numbers2 = Array.from(numbers, (value) => value + 1);
  9. console.log(numbers2); //[1,2,3]

为所有数组添加的新方法

find() 与 findIndex()

find()方法和findIndex()方法都接受两个参数:一个是回调函数;另一个是可选参数,用于指定回调函数中this的值
回调函数参数:(数组元素)elem,(当前元素的索引)index,(数组本身)array 与forEach() map() 方法相同
二者唯一的区别 find()方法返回查找到的值,findIndex()方法返回找到值的索引

  1. let numbers = [25, 30, 35, 40, 45];
  2. console.log(numbers.find(n => n > 33)); //35
  3. console.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数字类型的操作那样将值在多种格式间反复转换。