js之集合引用类型

69 阅读5分钟

Object

创建对象

  1. 使用Object创建对象

    let obj = new Object()
    obj.name = 'atuotuo';
    
  2. 使用字面量创建对象

    let obj = {
        name : 'atuotuo';
    }
    

Array

创建数组

  1. 使用Array创建数组

    let arr1 = new Array();// 创建一个长度为0 的数组
    let arr2 = new Array(20);// 创建一个包含20个元素的数组
    let arr3 = new Array(1,2,3); // 创建一个包含1,2,3的数组
    
  2. 使用字面量创建数组

    let arr = [1,2,3];
    
  3. 使用Array.from()创建数组

    第一个参数传递一个类数组对象,即任何可迭代对象或者有一个length属性和可索引元素的结构。

    //将字符串拆分为数组
    let arr = Array.from("123") // ['1','2','3']
    
    // 将类数组转为数组
    let arr1 = Array.from(arguments);
    
  4. 使用Array.of()创建数组

    array.of可以把一种参数转为数组

    Array.of(1,2,3,4); [1,2,3,4]
    

检测数组

  1. instanceof

    if(arr instanceof Array)
    
  2. Array.isArray

    if(Array.isArray(arr))
    
  3. Object.prototype.toString.call()

    if(Object.prototype.toString.call(arr) == '[object Array]')
    

数组方法

本文不再阐述,详细操作请参考:developer.mozilla.org/zh-CN/docs/…

Map

Map是ES6的新增特性,是一种新的集合类型,Map的大多特性都可以通过Object类型实现,但二者之间还是存在一些细微的差距。

object的键只能使用数值,字符串,或者符号作为键。但是map可以使用任何js数据类型作为键。

基础API

let map = new Map([['name','atuotuo']]);// 创建map对象
map.size; // 返回map中键值对的数量
map.set('age',20); //添加属性
map.get('name'); // 获取属性的值
map.has() // 判断map中是否存在key
map.delete('age'); // 删除delete
map.clear() // 清空map

迭代方法
map.keys(); // 返回键名的迭代器
map.values(); // 返回值的迭代器
map.ertries();// 返回所有成为的迭代器
map.forEach();// 遍历成员

WeakMap

weakmap是一种“弱映射”的新的集合类型。

若映射中的键只能是Object或者继承字Object的类型,键必须是引用类型。

weakmap的使用方式与map基本一致,但是键必须是引用类型,不可迭代。

弱键

存储再weakMap中的键,不属于正式的引用,不会阻止垃圾回收。只要键存在,键值对就会存在于映射中,并被当作对值的引用,因此就不会被当成垃圾回收

不可迭代键

因为WeakMap中的键值对任何时候都可能被摧毁,所以没有必要提供迭代器键值对的能力。

使用弱映射

  1. DOM节点元数据

    因为weakmap实例不会妨碍垃圾回收,所以适合保存关联元数据。可以有效避免内存泄漏

Set

set是es6新增的集合类型。它类似于数组,但是成员的值都是唯一的,没有重复的值。

基础api

let set = new Set();
set.size //返回Set实例的成员总数。

set.add(value) //添加某个值,返回 Set 结构本身。
set.delete(value) //删除某个值,返回一个布尔值,表示删除是否成功。
set.has(value) //返回一个布尔值,表示该值是否为Set的成员。
set.clear() //清除所有成员,没有返回值。

迭代方法
map.keys(); // 返回键名的迭代器
map.values(); // 返回值的迭代器
map.ertries();// 返回所有成为的迭代器
map.forEach();// 遍历成员

WeakSet

WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,WeakSet 的成员只能是对象,而不能是其他类型的值。

WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

常见面试题

常见的循环方式

let arr = [1,2,3];
let obj = {'name':'atuotuo'}
for(let i = 0;i < arr.length;i ++){} // 直接遍历
for(let item in obj){} // 遍历获取对象的key
for(let item of arr) // 遍历获取值,只能遍历对象中存在迭代器的对象
arr.forEach((item,index)=>{}) // 使用内置方法遍历,不能在中途break;
arr.map((item,index)=>{})
arr.filter((item,index)=>{})
arr.some(()=>{})
arr.every(()=>{})

Object于Map的区别

特性MapSet
意外的键map默认情况下不包含任何键,只包含显示插入的键object有一个原型,原型链上的键名有可能和自己在对象上设置的参数冲突
键的类型map的键可以是任意类型object必须是string或symbol
键的顺序map的key是有序的,插入的顺序object的键是无序的
sizemap的键值对个数可以通过size获取object的键值对个数只能手动计算
迭代map的通过iterable迭代器直接迭代迭代object需要以某种方式获取他的键才能进行迭代
性能频繁增删键值对的场景下表现更好频繁增删键值对的场景下没有进行优化

js类数组对象的定义

拥有length属性和若干索引属性的对象就可以被称为类数组。

类数组对象和数组类似,但是不能调用数组的方法,常见的类数组对象有arguments和DOM方法的返回结果。

将类数组转为数组的方法:

Array.prototype.slice.call(argumrnts)
Array.prototype.splice.call(argumrnts,0)
Array.prototype.concat.call([],arguments);
Array.from(arguments)

数组有哪些元素方法

类别方法
进出数组push,pop,shift,unshift,splice
排序和反转sort,reverse
切片slice
转字符串tostring,join
数组连接concat
查找元素indexOf,lastIndexOf,find
迭代方法forEach,map,every,filter,some
匹配和替换match,replace

obj.hasOwnProperty()

判断某个属性是否属于某个对象本身,不在原型链中寻找

for in 和 for of有什么区别

for…of 是ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组、对象等)并且返回各项的值,和for…in`的区别如下:

  • for…of 遍历获取的是对象的键值,for…in 获取的是对象的键名;
  • for…in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for…of 只遍历当前对象不会遍历原型链;
  • 对于数组的遍历,for…in 会返回数组中所有可枚举的属性(包括原型链上可枚举的属性),for…of 只返回数组的下标对应的属性值;

总结:for...in循环主要是为了遍历对象而生,不适用于遍历数组;for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象。