JavaScript数组常用方法总结

Javascript Array

  • 由于数组成员的键名是固定的(默认总是0、1、2…),因此数组不用为每个元素指定键名,而对象的每个成员都必须指定键名。JavaScript 语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。

  • length

// 只要是数组,就一定有length属性。该属性是一个动态的值,等于键名中的最大整数加上1。
  • 空位

    当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)

    数组的某个位置是空位,与某个位置是undefined,是不一样的。如果是空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。

    1. 数组的空位不影响length属性。

      var a = [1,,1];
      console.log(a.length); // 2
      
    2. 如果最后一个元素后面有逗号,并不会产生空位

      var a = [1,2,3,4,];
      consle.log(a.length); // 4
      
    3. 数组的空位是可以读取的,返回undefined

      var a = [,,,,,];
      a[1]; // undefined
      
    4. 使用delete命令删除一个数组成员,会形成空位,并且不会影响length属性。

      var a = [1,2,3,4];
      delete a[1];
      console.log(a.length);
      console.log(a[1]);
      
  • 数组和类数组

    如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)。

    1. 类数组转为类数组(字符串也是类数组)

      let arr  = Array.prototype.slice.call(arrylike);
      
    2. 类数组可以通过call来调用数组的方法

      let arrlike = {
        "0":'a',
        "1":"b",
        length:2
      }
      Array.prototype.forEach.call(arrlike,function(item,index) {
        	console.log(item,index);
      });
      
  • Array.prototype 所有数组实例都会从 [Array.prototype] 继承属性和方法。修改 Array 的原型会影响到所有的数组实例。

    1. [push()] / [pop()] - 在数组末尾增/删元素;

    2. [unshift()] / [shift()] - 在数组首部增/删元素;

    3. [concat()] - 把一个(或多个)数组和(或)值与原数组拼接,返回拼接后的数组。

    4. indexOf

    5. splice

      语法: array.splice(start[, deleteCount [, item1[, item2[, ...]]]]) 注意:在中括号外的是必要参数

      • start 起始索引
      • deleteCount待删除的个数
      • [item1,....] 插入的元素
      var myFish = ["angel", "clown", "mandarin", "sturgeon"];
          // 从索引2开始删除0个元素插入drum;
          // var removed = myFish.splice(2, 0, "drum");
          // console.log(removed);
          // 从索引2开始删除1个元素插入"truemp""
          var removed = myFish.splice(2, 1, "truemp");
          console.log(myFish);
      
      // 通过索引删除一个元素
      let pos = 1;
      let fruits = ["Strawberry", "Banana", "Mango"];
      let removeItem = fruits.splice(pos,1);
      
      
    6. slice

      // 赋值数组
      var shallowCopy = fruits.slice(); 
      // 浅拷贝就是基本类型值是直接复制值的,引用类型值是复制引用的(
      当在一个数组中修改引用数据类型的时候,也会影响另外一个)
      
      

      应用:将类数组转为数组

      [].slice.call(arraylike);
      Array.prototype.slice.call(arraylike);
      
  • Array

    1. from
    // 从类数组中构造数组,可以调用回调函数
    Array.from(arrlike)
    Array.from(arrlike,[mapFn])
    Array.from(arrlike).map(fn)
    
    // 从string中生成数组
    // 从set中生成数组
    // 从Map中生成数组
    // 从类数组对象中生成数组arguments
    
    // 序列生成器
    const range = (start, stop, step) => Array.from({length:stop-start/step + 1},(_,i)=>start+i*step);
    
    1. isArray

      // 判断是否为数组
      // 鲜为人知的事实:其实 Array.prototype 也是一个数组。
      Array.isArray(Array.prototype);
      
      // Array.isArray的实现方式
      if (!Array.isArray) {
        Array.isArray = function(arg) {
          return Object.prototype.toString.call(arg) === '[object Array]';
        };
      }
      
    2. of

      Array(7) // [ , , , , , , ] // 创建了7个数组的空位 这是指一个有7个空位(empty)的数组,而不是由7个undefined组成的数组
      Array.of(7) // [7]
      
慢慢来,比较快!基础要牢,根基要稳!向大佬致敬!
原文地址:https://www.cnblogs.com/rookie123/p/14473103.html