赞
踩
简述:
集合 与 字典 的区别:
ES6 新增的一种新的数据结构,类似于数组,成员唯一(内部元素没有重复的值)。且使用键对数据排序即顺序存储。
Set 本身是一种构造函数,用来生成 Set 数据结构。
Set 对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用。
- // let set = new Set(['1',2,1,'1'])
-
- const s = new Set()
- [1, 2, 3, 4, 3, 2, 1].forEach(x => s.add(x))
- for (let i of s) {
- console.log(i) // 1 2 3 4
- }
- // 去重数组的重复对象
- let arr = [1, 2, 3, 2, 1, 1]
- [... new Set(arr)] // [1, 2, 3]
注意:向 Set 加入值的时候,不会发生类型转换,所以5
和"5"
是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===
),主要的区别是**NaN
等于自身,而精确相等运算符认为NaN
不等于自身。** 另外,NaN
和undefined
都可以被存储在Set 中, NaN
之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)。
- let set = new Set();
- let a = NaN;
- let b = NaN;
- set.add(a);
- set.add(b);
- set // Set {NaN}
-
- let set1 = new Set()
- set1.add(5)
- set1.add('5')
- console.log([...set1]) // [5, "5"]
操作方法:
便利方法:遍历方法(遍历顺序为插入顺序)
WeakSet 对象允许你将弱引用对象储存在一个集合中。
WeakSet 与 Set 的区别:
方法:
是一组键值对的结构,具有极快的查找速度。
- // var map = new Map([[1, 2], [2, 3]]); // map = {1 => 2, 2 => 3}
-
- const m = new Map()
- const o = {p: 'haha'}
- m.set(o, 'content')
- m.get(o) // content
-
- m.has(o) // true
- m.delete(o) // true
- m.has(o) // false
操作方法:
遍历方法:
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。
方法:
Set:
WeakSet:
Map:
WeakMap:
在JavaScript中,Map 和 Object 看起来都是用键值对来存储数据,那么他们有什么不同呢?
不同点:
元素顺序:
继承:
Object 支持以下几种方法来创建新的实例:
- var obj = {...};
- var obj = new Object();
- var obj = Object.create(null);
Map 仅支持下面这一种构建方法:
var map = new Map([[1, 2], [2, 3]]); // map = {1 => 2, 2 => 3}
Map 想要访问元素,可以使用 Map 本身的原生方法:
Object 可以通过 .
和 [ ]
来访问:
- // 获取数据
- obj.id;
- obj['id'];
-
- // 新增/修改数据
- obj['key'] = value;
- obj.key = value;
-
- // 删除数据
- delete obj.id;
- // 下面这种做法效率更高
- obj.id = undefined
-
需要注意的是,使用 delete 会真正的将属性从对象中删除,而使用赋值 undefined 的方式,仅仅是值变成了 undefined。属性仍然在对象上,也就意味着 在使用 for … in… 去遍历的时候,仍然会访问到该属性。
判断某个元素是不是在 Object 中需要以下操作:
- obj.id === undefined;
- // 或者
- 'id' in obj;
另外需要注意的一点是,Object 可以使用
Object.prototype.hasOwnProperty()
来判断某个key是否是这个对象本身的属性,从原型链继承的属性不包括在内。
Map 自身有 size 属性,可以自己维持 size 的变化。
Object 则需要借助 Object.keys()
来计算
console.log(Object.keys(obj).length);
Map 自身支持迭代,Object 不支持。
如何确定一个类型是不是支持迭代呢? 可以使用以下方法:
- console.log(typeof obj[Symbol.iterator]); // undefined
- console.log(typeof map[Symbol.iterator]); // function
当需要在单独的逻辑中访问属性或者元素的时候,应该使用 Object,例如:
- var obj = {
- id: 1,
- name: "It's Me!",
- print: function(){
- return `Object Id: ${this.id}, with Name: ${this.name}`;
- }
- }
- console.log(obj.print());//Object Id: 1, with Name: It's Me.
- // 以上操作不能用 Map 实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。