聊聊 ES6 中新增的 Symbol 类型

《深入理解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) ]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章