Skip to main content

Array

Q:如何检测对象是否是数组?

  • A:

    const arr=[1,2,3,4];
    // 方法一:Array.isArray();
    Array.isArray(arr);

    // 方法二:instanceof
    arr instanceof Array

    // 方法三:Object.prototype.toString.call
    Object.prototype.toString.call(arr).slice(8,-1)==='Array';

    // 方法四:Array.prototype.isPrototypeOf
    Array.prototype.isPrototypeOf(arr);

    // 方法五:原型对比
    arr.__prototype__ === Array.__prototype__;
    • 相关知识点:

      const notCall = Object.prototype.toString(arr);
      // 这里的this为Object
      // =>['object','object']
      const useCall = Object.prototype.toString.call(arr);
      // 这里的this为arr中的this
      // =>['object','array']

Q:数组设置超过数组长度的值时,会产生啥?

  • A:JavaScript 会创建名为 "empty slots" 的东西。它们的值实际上是 undefined

    const numbers = [1, 2, 3]
    numbers[10] = 11
    //[1, 2, 3, 7 x empty, 11]
    console.log(numbers)

Q:什么是array.push()

  • A:将数据项插入数组尾部。
    • 返回值:插入后的数组长度。

Q:会影响源数组的方法?

  • A:

    方法描述
    splice对源数组进行切割
    push
    pop
    shift
    unshift

Q:会形成并返回新数组的方法?

  • A:

    方法描述
    map遍历生成新数组
    filter过滤并生成新数组
    slice切割并返回切割后的新数组

Q:数组铺平方法有哪些?

  • A:
    • {array}.flat(layer)

Map

  • 【ES6】新的集合类型

  • Map可以使用任何数据类型作为键

  • Map实例会维护键值对的插入顺序。

    • 映射实例可以提供一个迭代器

      const m=new Map([
      ["key1","val1"],
      ["key2","val2"],
      ["key3","val3"],
      ])

      console.log(m.entries===m[Symbol.iterator])//true;
    • Map对象转数组

      console.log([...m])//[[key1,val1],[key2,val2],[key3,val3]]
    • 遍历Map对象与遍历Object对象一致

      for(let key of m.keys()){
      console.log(key);
      }
      //key1
      //key2
      //key3

      for(let val of m.values()){
      console.log(val);
      }
      //value1
      //value2
      //value3
    • 键和值在迭代器遍历时是可以修改的,但映射内部的引用无法修改。

Set

Q:Set构造函数创建出来的返回值是什么类型?

  • A:对象。

    const set = new Set([1, 1, 2, 3, 4]);

    console.log(set);//{1,2,3,4}

Q:set对象如何转数组类型?

  • A:

    const s=new Set(['val1','val2','val3']);
    console.log([...s]);

Q:map和set的区别?

  • A:

    mapset
    集合内容一组键值对一组唯一值
    创建对象new Map(二维数组)new Set(数组)
    元素构成键是唯一的,值可以重复值是唯一的,不允许重复
    添加元素.set(key, value).add(ele)
    获取元素.get(key)[...set]?.[index]
    遍历方法forEachfor...of

    相同点:

    相同apiMap描述set描述
    .size()获取映射中的键/值对的数量获取元素数量
    .has(key/ele)查询是否存在key查询元素
    .delete(key/ele)删除key的键/值对删除元素
    .clear()清除这个映射实例中的所有键/值对销毁集合实例中所有的值
  • set可以包含任何数据类型的值。

  • set支持顺序迭代

    • 集合实例可以提供一个迭代器

      const s=new Set(['val1','val2','val3']);
      console.log(s.values===s[Symbol.iterator])//true;
      console.log(s.keys===s[Symbol.iterator])//true;
    • 遍历set对象

      //以上述案例
      for(let [key,value] of s.entries()){
      console.log(key,value);
      }
      // val1,val1
      // val2,val2
      // val3,val3
      s.forEach((key,value)=>console.log(key,value))//输出同上
    • 在遍历中修改set对象的值

      const s1 = new Set(["val1"]);

      for(let val of s1.values()){
      val='newVal';
      console.log(val);//newVal
      console.log(s1.has('val1'))//true;
      }
      //set元素为数组时,无法修改其值

      const valObj={id:1}
      const s2 = new Set([valObj]);
      for(let val of s2.values()){
      val.id='newVal';
      console.log(val);//{id:'newVal'}
      console.log(s1.has(valObj))//true;
      }
      console.log(valObj);//{id:'newVal'}
      //set元素为Object时,可以修改其中的值。