当前位置: 首页 > news >正文

【面试题】Map和Set

1. Map和Object的区别

  • 形式不同
// Object
var obj = {key1: 'hello',key2: 100,key3: {x: 100}
}
// Map
var m = new Map([['key1', 'hello'],['key2', 100],['key3', {x: 100}]
])
  • API不同
// Map的API
m.set('name', '小明')    // 新增
m.delete('key2')     // 删除
m.has('key3')      // 判断是否有'key3'
m.forEach((value, key) => console.log(key, value))    // 使用forEach来循环遍历Map
m.size    // 可以获取Map的长度
m.get('key1')   // 获取键名为'key1'的值
  • Object只能以字符串类型作为 key,但是Map能以任何类型最为 key
var a = {name: 'xxx'}
m.set(a, 'object key')

在这里插入图片描述

  • Map是有序结构,Object是无序结构

Map虽然是有序结构,但是它的相关操作依然速度很快。下面举一个例子,分别在Map和Object中进行相同的操作,观察所花费的时间。

var obj = {}
for(let i = 0; i < 100 * 10000; i++){obj[i + ''] = i
}var m = new Map()
for(let i = 0; i < 100 * 10000; i++){m.set(i + '', i)
}// 查找操作花费时间对比
console.time('obj find')
obj['200000']
console.timeEnd('obj find')console.time('map find')
obj['200000']
console.timeEnd('map find')// 删除操作花费时间对比
console.time('obj delete')
delete obj['200000']
console.timeEnd('obj delete')console.time('map delete')
m.delete['200000']
console.timeEnd('map delete')

在这里插入图片描述

2. Set和Array的区别

  • 形式不同
// Array
var arr = [10, 20, 30, 40]
// Set
var set = new Set([10, 20, 30, 40])
  • API不同
// Set的API
set.add(50)   // 增加
set.delete(10)   // 删除
set.has(30)     // 判断是否有 30
set.size        // 获取Set的长度
set.forEach(val => console.log(val))   // 循环遍历
  • Set元素不能重复(可以用于数组去重),数组元素可以重复
function unique(arr){const set = new Set(arr)return [...set]
}
  • Set是无序结构,操作快;Array是有序结构,操作慢。下面举一个例子,分别在Set和Array中进行操作,观察所花费的时间。
var arr = []
for(let i = 0; i < 100 * 10000; i++){arr.push(i)
}var set = new Set()
for(let i = 0; i < 100 * 10000; i++){set.add(i)
}// Array添加元素花费的时间
console.time('arr unshift')
arr.unshift('a')
console.timeEnd('arr unshift')console.time('arr push')
arr.push('b')
console.timeEnd('arr push')// Set添加元素花费的时间
console.time('set add')
set.add('a')
console.timeEnd('set add')// 查找操作花费的时间
console.time('arr find')
arr.includes(500000)
console.timeEnd('arr find')console.time('set find')
set.has(500000)
console.timeEnd('set find')

在这里插入图片描述

3. WeakMap和WeakSet

  • WeakMap 和 WeakSet 是弱引用,目的是防止内存泄漏
  • WeakMap 只能使用对象作为 key,WeakSet 只能使用对象作为 value
  • 因为WeakMap 和 WeakSet 是弱引用,里面的key随时可能会被销毁,所以不能使用 forEach 和 size,只能使用 add delete has。
// WeakMap 
var wMap = new WeakMap()function fn(){const obj = {name: '小明'}wMap.set(obj, 'name info')   // 弱引用
}fn()

在这里插入图片描述

http://www.lryc.cn/news/11973.html

相关文章:

  • Spring之事务底层源码解析
  • 【华为OD机试真题 Python】创建二叉树
  • RuoYi-Vue-Plus搭建(若依)
  • uboot和linux内核移植流程简述
  • 【CS224W】(task2)传统图机器学习和特征工程
  • 【算法基础】并查集⭐⭐⭐⭐⭐【思路巧,代码短,面试常考】
  • 人工智能轨道交通行业周刊-第34期(2023.2.13-2.19)
  • Retrofit 网络框架源码解析(二)
  • SQL Server 2008新特性——更改跟踪
  • 四六级真题长难句分析与应用
  • 华为OD机试 - 玩牌高手(Python) | 机试题算法+思路 【2023】
  • 【论文阅读】 Few-shot object detection via Feature Reweighting
  • 现代卷积神经网络经典架构图
  • 有关eclipse的使用tips
  • Mybatis(4)之CRUD
  • OSG三维渲染引擎编程学习之五十七:“第五章:OSG场景渲染” 之 “5.15 光照”
  • [教你传话,表白,写信]
  • 物联网在智慧农业中的应用
  • 【RabbitMQ】Windows 安装 RabbitMQ
  • MQTT8-MQTT在智能汽车公司的实际应用
  • 在elasticsearch8.3中安装elasticsearch-analysis-ik中文分词插件
  • 初识K8s
  • 搭建企业级docker仓库—Harbor
  • 【Linux】shell中运算符(整数、字符串)
  • 【从零单排Golang】第八话:通过cache缓存模块示范interface该怎么用
  • 解析从Linux零拷贝深入了解Linux-I/O(上)
  • JavaScript系列之公有、私有和静态属性和方法
  • 过滤器与拦截器
  • spring boot 和cloud 版本升级
  • untiy 录制网络摄像头视频并保存到本地文件