对象的扩展
1. ES6 允许直接写入变量和函数作为对象的属性和方法
当属性名是表达式时
let obj = {
['a'+'b'+'c']: 123
}
ES6 允许在对象中只写属性名, 不写属性值, 这时 属性值等于属性名所代表的变量,这种写法用于函数的返回值会非常方便

2. Object.assign()
Object.assign 方法用于将源对象的所有可枚举属性复制到目标对象
Object.assign( target, source1, source2)
同名属性, 后边的覆盖前边的
需要注意的是Object.assign进行的浅克隆, 而不是深克隆
3. Object.keys()
ES5 引入了Object.keys 方法, 返回一个数组, 成员是参数对象自身的(不含继承的) 所有可遍历(enumerable)属性的键名
Object.values() 方法返回一个数组, 成员是参数对象自身的(不含继承的) 所有可遍历属性的值
Object.entries 方法返回一个数组, 成员是参数对象自身的(不含继承的)所有可比遍历属性的键值对数组
4. 对象的扩展运算符
解构赋值 let { x, y, …z } = { x:1, y:2, a:3, b:4}
解构赋值必需是最后一个参数
解构赋值的复制也是浅克隆
Set 和 Map 数据结构
Set
ES6 提供了新的数据结构—- Set , 类似于数组, 但是成员的值都是唯一的, 没有重复
Set本身是一个构造函数, 用来生成Set数据结构
const s = new Set();
[ 2, 3, 5, 2, 2 ].forEach( x => s.add(x) );
————————
const set = new Set( [1, 2, 3, 4, 4] );
Set也支持keys(), values(), entries(), 不过因为Set没有key值, 所以keys和values 行为是一样的
Map
JavaScript 的对象 ( Object ) 本质上是键值对的集合( Hash 结构 ), 但是只能用字符串作为键, 这给它的使用带来了很大限制
为了解决这个问题, ES6 提供了 Map数据结构. 它类似于对象, 也是键值对的集合, 但是”键” 的范围不限于字符串, 各种类型的值都可以当做键

通过构造函数初始化, Map可以接受一个数组作为参数. 该数组的成员是一个个表示键值的数组
以及一些常用方法

注意: 只有对同一个对象的引用, Map结构才将其视为同一个键
与其他数据结构互相转换
1. Map 转为数组
Map转为数组最方便的方法就是使用扩展运算符( … )
2. 数组转为Map
将数组传入Map构造函数就可以转为Map
3. Map转为对象
const map = new Map(
[
[1,"number 1"],
[2,"number 2"]
]
);
function strMapToObj(strMap){
let obj = Object.create(null);
for(let [k,v] of strMap){
obj[k] = v
}
return obj
}
console.log(strMapToObj(map));

4. 对象转Map
let obj = {
a:1,
b:2,
c:3
}
function objToStrMap(obj){
let map = new Map();
for(let k of Object.keys(obj)){
map.set(k, obj[k]);
}
return map;
}
console.log(objToStrMap(obj));

5. Map 转 JSON 对象
Map转为JSON要区分两种情况, 如果Map的键名都是字符串, 这时可以选择转为对象JSON
const map = new Map([[1, "number 1"], [2, "number 2"]]);
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k, v] of strMap) {
obj[k] = v;
}
return obj;
}
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
console.log(strMapToJson(map))

6. JSON 转为 Map
function objToStrMap(obj) {
let map = new Map();
for (let k of Object.keys(obj)) {
map.set(k, obj[k]);
}
return map;
}
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
let jsonStr = '{"name":"lizhe"}';
console.log(jsonToStrMap(jsonStr));
