聊聊 ES6 中新增的 Symbol 类型
2021-01-25 本文已影响0人
F_wind
《深入理解ES6》阅读随笔
创建
在 ES5 及之前,对象的属性名都是通过字符串来表示的。Symbol 是 ES6 新增的第六种基本类型,也可以作为对象的声明属性名;
let cat = Symbol();
let animal = {};
animal[cat] = "Tom";
console.log(animal[cat]); // 输出 Tom
Symbol 默认接收一个可选参数,用于描述用途:
let cat = Symbol("cat");
用途
Symbol 创建的变量具有唯一性:
// ES5
let dog1 = "dog"
let dog2 = "dog"
console.log(dog1 === dog2); // 输出 true
// ES6
let cat1 = Symbol("cat");
let cat2 = Symbol("cat");
console.log(cat1 === cat2); // 输出 false
共享体系
在全局环境下定义的 Symbol 可能会出现访问错乱的问题,此时需要使用 Symbol.for 的方式来声明变量:
let cat1 = Symbol.for("cat");
let cat2 = Symbol.for("cat");
console.log(cat1); // 输出 Symbol(cat)
console.log(cat1); // 输出 Symbol(cat)
如果声明已存在,则直接取值,否则创建;
强制类型转换
在使用 console.log 输出 Symbol 时,会默认调用 toString 转换为字符串结果输出;但并未对其进行强制转换,依旧是 Symbol 类型:
let cat = Symbol("cat");
console.log(cat); // 输出 Symbol(cat)
console.log("name:"+cat) // error
Symbol 与其他五类基础类型均不可能相互转换;
检索
可以通过 Object.getOwnPropertySymbols 方法来枚举 Symbol 类型的属性:
let cat = Symbol.for("cat");
let animal = {
[cat]: "cat",
};
animal["dog"] = "dog";
console.log(Object.getOwnPropertySymbols(animal)); // 输出 [ Symbol(cat) ]