ES6:Map 和 Set

Map

ES6新增Map类型对象:
说明:
Map 对象保存键值对,并且能够记住键的原始插入顺序。
任何值(对象或者原始值) 都可以作为一个键或一个值。
Objects 和 Maps 类似,它们都允许你按键存取值、删除键、检测一个键是否绑定了值。
过去我们一直都把对象当成 Maps 使用,不过 Maps 和 Objects 有一些重要的区别。
在下列情况里使用 Map 会是更好的选择:

项 目MapObject
额外键不包含任何额外键,只包含明确声明的键包含原型链中的键,声明时可能冲突
键类型任何类型字符串、Symbol
键顺序按照插入顺序排序无序(ES6字符串键有序,ES11继承属性有序,Symbol 键始终在字符串键后)
属性数通过 size方法获取手动计算
迭代可直接被迭代需获取键然后迭代
性能在频繁增删键值对的场景下表现更好在频繁添加和删除键值对的场景下未作出优化

方法:

  • get(key) 不存在则返回undifined
  • set(key, value) 返回 Map 对象
  • has(key)
  • delete(key) 返回值和 has 方法相同,存在返回 true,不存在返回 false
  • clear()
  • size()
  • keys()
  • values()
  • entries()
  • forEach(callback [, _this]) 如果声明了_this参数,它将被作为callback每次执行时的this

注意:

let myMap = new Map()

// 将 NaN 作为键名 
myMap.set(NaN, 'not a number')
myMap.get(NaN) // "not a number"

// 尽管 NaN !== NaN,作为 Map 键名时视为同一个键
let otherNaN = Number('foo')
myMap.get(otherNaN) // "not a number"
myMap.delete(otherNaN) // true

myMap.set(0, 'zero')
myMap.set(1, 'one')

// 使用 for ... of 迭代 Map
for (let [key, value] of myMap) {
  console.log(key + ' = ' + value)
} // 0 = zero 1 = one

for (let key of myMap.keys()) {
  console.log(key)
} // 0 1

for (let value of myMap.values()) {
  console.log(value)
} // zero one

for (let [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value)
}  // 0 = zero 1 = one

// 复制 Map (浅拷贝)
myMap.set('obj',{ a: 'a' });
let clone = new Map(myMap);
console.log(clone.get(0)); // zero
console.log(clone.get(1)); // one
console.log(clone.get('obj')); // { a : "a" }
console.log(clone.get('obj') === myMap.get('obj')); // true 仅为浅拷贝
console.log(myMap === clone); // false 不为同一个对象的引用

// 不要直接设置 Map 对象的属性!!!
myMap['wrong'] = 'wrong'
// 尽管可以设置成功
console.log(myMap)  // Map {'wrong'=>'wrong'}
// 但会有意外错误引起混乱
myMap.has('wrong')    // false
myMap.delete('wrong') // false
console.log(wrongMap)  // Map {'wrong'=>'wrong'}

Set

Set对象是值的集合,允许存储任何类型唯一值,无论是原始值或者是对象引用。
Set对象可以按照插入的顺序迭代其元素。

注意:NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)
示例:

let mySet = new Set();

mySet.add(1); // Set [ 1 ]
mySet.add(5); // Set [ 1, 5 ]
mySet.add(5); // Set [ 1, 5 ] 5已经存在,add不会加入重复值,保证唯一性
mySet.add("some text"); // Set [ 1, 5, "some text" ]
mySet.add({a: 1, b: 2}); // Set [ 1, 5, "some text" , {…}]
let o = {a: 1, b: 2}; // o 和 {a: 1, b: 2} 指向的不同对象引用,add可以正常执行
mySet.add(o);  // Set [ 1, 5, "some text" ,{…},{…}]

mySet.has(1); // true
mySet.has(3); // false
mySet.has(5);  // true
mySet.has(Math.sqrt(25));  // true
mySet.has("Some Text".toLowerCase()); // true
mySet.has(o); // true

mySet.size; // 5

mySet.delete(5);  // true,  从set中移除5
mySet.has(5);     // false, 5已经被移除

mySet.size; // 4, 刚刚移除一个值

// 使用 Array.from 转换Set为Array
let myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}]

// 使用 Array 创建 Set 将自动去重
let mySet2 = new Set([1, 2, 3, 4, 4]); // Set(4) [1, 2,3, 4]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值