Symbol
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
let sy = Symbol("KK");
console.log(sy); // Symbol(KK)
typeof(sy); // "symbol"
// symbol作为键名
let syObject = {
[sy]: "kk"
};
Proxy
Proxy是在对象的外层搭了一层拦截,任何对象的操作都要经过这层拦截。
- Proxy对象有两个参数target与handler
- handler方法:get, set, apply,
const target = {name: "dennis"};
const handler = {get: function(target, key) {} };
const proxy = new Proxy(target, handler);
Reflect
ES6 中将 Object 的一些明显属于语言内部的方法移植到了 Reflect 对象上,未来的新方法会只部署在 Reflect 对象上。
- Reflect.get(target, name, receiver)
- Reflect.set(exam, 'age', 25);
let exam = {
name: "Tom",
age: 24,
get info(){
return this.name + this.age;
}
}
Reflect.get(exam, 'name'); // "Tom"
Map与Set
- Map方法:get, set, forEach
- Map可以与Array互换(Array.from)
- Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
let user = new Map([["key1", "value1"], ["key2", "value2"]]);
// 合并Map
var merged = new Map([...first, ...second]);
Map与Object的区别
- Object的键只能是字符串或者Symbols,而Map可以是任意值;
- Map中的键值是有序的(FIFO),而Object则是无序的;
- Map.size可以取得长度,但Object只能自己计算;
- Object有原型,名字可能冲突;
网友评论