ES6和ES5的区别和扩展2

一 Symbol

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

let s = Symbol();
typeof s // "symbol"
// 没有参数的情况
let s1 = Symbol();
let s2 = Symbol();
s1 === s2 // false

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');
s1 === s2 // false

1 Symbol.prototype.description

const sym = Symbol('foo');

sym.description // "foo"

2 Symbol.for(),Symbol.keyFor()

Symbol.for()它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

Symbol.for()为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行。

二 Set 和 Map 数据结构

1 set

Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构。

const set = new Set([1, 2, 3, 4, 4]);
[...set]// [1, 2, 3, 4]
Set 实例的属性和方法

Set 结构的实例有以下属性。

  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回Set实例的成员总数。

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

  • Set.prototype.add(value):添加某个值,返回 Set 结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。
s.add(1).add(2).add(2);// 注意2被加入了两次
s.size // 2

s.has(2) // true
s.has(3) // false

s.delete(2);
s.has(2) // false
遍历操作

Set 结构的实例有四个遍历方法,可以用于遍历成员。

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员

2 WeakSet

WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。

首先,WeakSet 的成员只能是对象,而不能是其他类型的值。

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

  • WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
  • WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
  • WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

3 Map

Map 数据结构,它类似于对象,但是键的范围不限于字符串,可以为各种类型的值(对象或者原始值)

Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现

//key 是对象
let map = new Map();
let obj = {msg:'hello'}

//map设置和获取值(用一个对象作为了键)
map.set(obj, 'content')
map.set('key', 'value')
map.get(obj) // 'content'

//size 属性
map.size //2

//返回一个布尔值,表示某个键是否在当前 Map 对象之中
map.has(obj)  //true

//删除某个键,返回true。如果删除失败,返回false
map.delete(obj) //true

//清除所有成员,没有返回值。
map.clear()

//遍历方法
keys(),values(),entries()
//注:Map 的遍历顺序就是插入顺序

Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • Map.prototype.keys():返回键名的遍历器。
  • Map.prototype.values():返回键值的遍历器。
  • Map.prototype.entries():返回所有成员的遍历器。
  • Map.prototype.forEach():遍历 Map 的所有成员。

需要特别注意的是,Map 的遍历顺序就是插入顺序

map对象的操作
//Map 与 Array的转换
//map构造函数 可以与一个 二维键值对数组 相互转换
let arr = [
  ['key1', 'val1'],
  ['key2', 'val2'],
]
let map = new Map(arr);
let outArr = Array.from(map);

//Map的克隆
let map1 = new Map(arr);
let cloneMap1 = new Map(map1);

//Map的合并
//如果有重复的键值,则后面的会覆盖前面的
let arr2 = [
  ['key1', 'val1'],
  ['key2', 'val2'],
  ['key3', 'val3'],
]
let first = new Map(arr);
let second = new Map(arr2);
let merged = new Map([...first,...second]);

//Map 转为 JSON
function strMapToJson(strMap) {
  return JSON.stringify(strMapToObj(strMap));
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToJson(myMap)// '{"yes":true,"no":false}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值