[ES6] 细化ES6之 -- 键值对集合
Set集合
Set集合是什么
Set对象是值的集合,可以按照插入的顺序迭代它的元素。
Set集合中的
元素只会出现一次
,即 Set集合中的元素是唯一的,没有重复的值。Set
本身是一个构造函数,用来生成 Set 数据结构。
const arr = [1,2,3,3,4,5,2]
let set = new Set(arr)
console.log(set);// Set {1,2,3,4,5}
// console.log(Set.prototype);// Set {}
NaN. undefined等值允许被存储在Set集合中
NaN值在Set集合中被认为是相等的
let set1 = new Set([NaN,NaN,undefined,undefined,null,null])
console.log(set1);// Set { NaN,undefined,null }console.log(undefined === undefined);//true
- set集合中存储复杂数据类型(数组、对象及函数等)
- 空数组和空对象表示多个值
- 多个函数依旧也表示多个值
console.log([] === []);// false
console.log({} === {});// false
let set2 = new Set([[],[],{},{},function () {},function () {}])
console.log(set2);// Set { [], [], {}, {}, [Function], [Function] }
Set集合的属性与方法
属性
属性名称 | 描述 |
---|---|
constructor |
构造函数,默认就是Set 函数
|
size |
返回Set 对象的值的个数。
|
let set = new Set([1,2,3,4,5])// set的size属性相当于数组中的length属性
console.log(set.size);// 5
操作方法
方法名称 | 描述 |
---|---|
add(value) | 添加某个值,返回 Set 结构本身 |
delete(value) |
删除某个值(不是索引值 ),返回一个布尔值,表示删除是否成功
|
has(value) |
返回一个布尔值,表示该值是否为Set 的成员
|
clear() | 清除所有成员,没有返回值 |
/*add (value) -向Set集合的结尾添加新的元素*返回值 – 添加新元素后的Set集合*/
set.add(6)
console.log(set);// Set { 1, 2, 3, 4, 5, 6 }/*delete(value) - 从set集合删除指定元素*value - 表示Set集合中的元素内容(值)*返回值 - 布尔值,true表示删除成功,false表示删除失败*/
set.delete(1)
console.log(set);// Set { 2, 3, 4, 5, 6 }/*has (value) - 判断指定Set集合中是否包含指定元素*value - 表示Set集合中的元素内容(值)*返回值 - 布尔值,true表示包含,false表示不包含*/
var result = set.has(4)
console.log(result);// true// clear() - 清空所有成员
set.clear()
console.log(set);// Set {}
遍历方法
方法名称 | 描述 |
---|---|
values() |
返回一个新的迭代器对象,该对象包含 Set集合中的按插入顺序 排列的所有元素的值
|
keys() | 与values0方法相同 |
entries() |
返回一个新的迭代器对象,该对象包含Set集合中的按插入顺序 排列的所有元素的值的[value, value]数组
|
forEach() | 按照插入顺序,为 Set 集合中的每一个元素调用一次callback函数 |
- values() - 返回的当前set集合中所有值的迭代器对象
- keys() - 返回的当前set集舍中所有键的迭代器对象
- entries() - 返回的当前Set集合中所有键值的迭代器对象
let set = new Set([1,2,3,4,5]);
/*values()方法 - 返回一个迭代器对象(SetIterator)*没有length属性值 – 常规的循环语句无法使用*不能for...in循环语句*只能使用for...of进行循环*/
// console.log(set.values());// [Set Iterator] { 1, 2, 3, 4, 5 }
var iterator = set.values()
for(var name of iterator){console.log(name);
}/*虽然set集合具有size属性–表示当前set集合中元素的个数但是Set集合获取每一个元素内容,不能使用set[索引值]的方式
*/
for (let i=0; i<set.size; i++) {console.log(set[i]);
}/*set集合提供的遍历的方法* values() - 返回的当前set集合中所有值的迭代器对象* keys() - 返回的当前set集舍中所有键的迭代器对象* entries() - 返回的当前Set集合中所有键值的迭代器对象* Set集合的特殊 - set集合中键与值相同*/
console.log(set.entries());// [Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ] }
- set集合提供forEach()方法
作用 ― 用于遍历当前的Set集台(为Set集合中每个元素调用callback函数)
回调函数 – function (value,key,set){}
- value - 表示当前Set集合中每一个值
- key - 表示当前Set集合中每一个键
- 表示当前Set集合中每一个键
- set - 表示当前遍历的Set集合
set.forEach(function (value,key,set) {console.log(value, key, set);
})
/*
1 1 Set { 1, 2, 3, 4, 5 }
2 2 Set { 1, 2, 3, 4, 5 }
3 3 Set { 1, 2, 3, 4, 5 }
4 4 Set { 1, 2, 3, 4, 5 }
5 5 Set { 1, 2, 3, 4, 5 }*/
Set集合与Array对比
数组中用于判断元素是否存在的indexOf()函数效率低下。
Set 对象允许根据值删除元素,而数组中必须使用基于下标的
splice()
方法。数组的 indexOf()方法无法找到
NaN
值。Set对象存储不重复的值,所以不需要手动处理包含重复值的情况。
WeakSet集合
WeakSet是什么
WeakSet对象是一些对象值的集合,并且其中的每个对象值都只能出现一次。
WeakSet 对象与Set 对象的区别主要有两点:
Set | WeakSet |
---|---|
存放对象引用和值 |
只能存放对象引用 ,不能存放值
|
对象是值的集合 | 对象都是弱引用,没有枚举和遍历迭代 |
//weakset集合只能存储对象,存储的对象无法被枚举
var ws = new WeakSet()
var obj1 = {name :'张无忌'
}
var obj2 ={name :'周芷若'
}
ws.add(obj1).add(obj2);
console.log(ws);// WeakSet { <items unknown> }
WeakSet集合的方法
方法名称 | 描述 |
---|---|
add(value) | 在WeakSet 集合尾部添加一个元素,返回该WeakSet 对象 |
delete(value) | 从 WeakSet集合删除指定的元素。返回布尔值,表示是否删除成功 |
has(value) | 检索WeakSet 集合是否包含指定的元素。返回布尔值,表示是否包含 |
clear() | 清除WeakSet集合中所有元素,没有返回值 |
Map集合
Map集合是什么
Map集合是键值对的集合。
任何值都可以作为Map集合中的键或值。
Map 集合可以按照插入的顺序迭代它的元素。
Map集合的属性与方法
属性
- size - 返回 Map 结构的成员总数。
方法
方法名称 | 描述 |
---|---|
set(key, value) | 设置Map对象中键的值。返回该 Map 对象 |
get(key) | 返回键对应的值。如果不存在,则返回undefined |
delete(key) | 从Map 集合删除指定的键值对。返回布尔值,表示是否删除成功 |
has(key) | 检索Map 集合是否包含指定键对应的值。返回布尔值,表示是否包含 |
clear() | 清除 Map集合中所有键值对,没有返回值 |
values() | 返回一个新的迭代器对象,该对象包含 Map集合中所有元素的值 |
keys() | 与values()方法相同 |
entries() | 返回一个新的迭代器对象,该对象包含Map 集合中的按插入顺序排列的所有元素的值的[key, value]数组 |
forEach() | 按照插入顺序,为Map 集合中的每一个元素调用一次callback函数 |
//创建Map集合-空集合
let map = new Map();
let num = 100,str ='张无忌', fun = function(){},obj = {}map.set('num', num);
map.set('str', str);
map.set('fun', fun);
map.set('obj',obj);console.log(map);console.log(map.get('str'));//张无忌map.delete('num')
console.log(map);//Map { 'str' => '张无忌', 'fun' => [Function: fun], 'obj' => {} }var result = map.has('str')
console.log(result);// true/*
map.clear()
console.log(map);// Map {}*/console.log(map.values());// [Map Iterator] { '张无忌', [Function: fun], {} }
console.log(map.keys());// [Map Iterator] { 'str', 'fun', 'obj' }
Map集合键的相等
Map集合的键的比较是基于“SameValueZero”算法:
判断使用与===相似的规则。
-0和+0相等。
NaN 与自身相等(与===有所不同)。
Map集合与Object对比
一般情况下,Object 会被用于将字符串类型映射到数值。Object 允许设置键值对、根据键获取值、删除键、检测某个键是否存在。而 Map具有更多的优势:
Object 的键均为String 类型,在 Map里键可以是任意类型。
必须手动计算 Object 的尺寸,但是可以很容易地获取使用Map的尺寸。
Map 的遍历遵循元素的插入顺序。
Object有原型,所以映射中有一些缺省的键。
WeakMap集合
WeakMap集合是什么
用于生成键值对的集合
它的键
必须是对象类型
,值
可以是任意类型
不可枚举
WeakMap集合的方法
方法名称 | 描述 |
---|---|
set(key, value) | 设置WeakMap 对象中键的值。返回该WeakMap对象 |
get(key) | 返回键对应的值。如果不存在,则返回undefined |
delete(key) | 从WeakMap 集合删除指定的键值对。返回布尔值,表示是否删除成功 |
has(key) | 检索WeakMap集合是否包含指定键对应的值。返回布尔值,表示是否包含 |
[ES6] 细化ES6之 -- 键值对集合相关推荐
- 【Redis】Redis 哈希 Hash 键值对集合操作 ( 哈希 Hash 键值对集合简介 | 查询操作 | 增加操作 | 修改操作 )
文章目录 一.哈希 Hash 键值对集合 二.查询操作 1.Redis 中查询 Hash 键值对数据 2.查询 Hash 键是否存在 3.查询 Hash 中所有的键 Field 4.查询 Hash 中 ...
- [ES6] 细化ES6之 -- 迭代器与生成器
Symbol Symbol是什么 ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值 Symbol 值通过Symbol函数生成 let symbol = Symbol(); consol ...
- 集合与泛型集合与键值对集合
1,集合 (Connections) ArrayList arr = new ArrayList();//可以add arr.Add("Hello girls!");//支持添加o ...
- 红黑树 键值_Java集合框架:红黑树概念、插入及旋转操作详细解读就问你会不会...
初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外, ...
- [ES6] 细化ES6之 -- 数组的扩展
扩展运算符 扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列.允许一个表达式在原地展开 // 定义一个数组 var arr ...
- [ES6] 细化ES6之 -- 变量的解构赋值
变量的解构赋值 解构赋值是什么 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值 var/let [变量名称1,变量名称2,...] = 数组或对象 本质上,这种写法属于"模式 ...
- [ES6] 细化ES6之 -- Class关键字
类的声明 类是什么 类作为对象的模板,只是一个语法糖 class 关键字是让对象原型的写法更加清晰.更像面向对象编程的语法而已. // ES5创建构造函数 function Hero() {this. ...
- [ES6] 细化ES6之 -- 对象的扩展
对象的属性 属性表示法 ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法 ES5 let name = "张无忌"; function sayMe() {cons ...
- [ES6] 细化ES6之 -- 函数的扩展
函数参数的默认值 函数参数指定状认值 ES6 之前,不能直接为函数的参数指定默认值,如果定义了形参,不传递实参时导致形参为undefined,只能采用变通的方法. //ES5 function fn( ...
最新文章
- 谷歌力作:神经网络训练中的Batch依赖性很烦?那就消了它!
- COMP0037 Coursework Investigating Path Planning Algorithms
- 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
- 解决Matlab Help文档需要登录才能查看的问题
- 使用关键字SCAN ABAP-SOURCE对ABAP源代码进行语法扫描
- 特征工程之自动特征生成(自动特征衍生)工具Featuretools介绍
- 时间序列模型matlab_平稳时间序列分析01---AR模型
- Android 系统蓝牙 控制手机端音乐暂停 (AVRCP)
- 感觉所有的方法都有人做了,NLPer怎么找创新点?
- [SDOI 2015] 星际战争
- InnoDB下SQL执行底层原理和redolog、binlog
- Linux 云服务器aircrack-ng后台跑包并用邮件发送结果
- ■ 直接调用阿里云视频点播API实现视频播放
- 老九学堂 学习C++ 第六天
- 【图神经网络】图数据和图数据相关任务
- 推荐四款非常好用的免费音乐播放器
- 引入超融合技术解决虚拟机性能不足问题
- SOI技术及产业发展研究
- TCP/IP详解:TCP——超时和重传
- spring-security(二十五)鉴权