ES6 符号

普通符号

es6 规定,现在属性名除了是字符串之外,还有了一个属性名 symbol

符号是 ES6 新增的一个数据类型,它通过使用函数Symbol(符号名)来创建

符号设计的初衷,是为了给对象设置私有属性 - 私有属性: 只能在对象内部使用,外面无法使用
符号具有以下特点:

  • 没有字面量 (字面量: --> 数字: 123, 字符串: 'abc', boolean: false, true, 对象: {} ,这些都是字面量体现,但是 symbol 没有)
  • 使用 typeof 得到的类型是 symbol
  • 每次调用 Symbol 函数得到的符号永远不相等,无论符号名是否相同
  • 符号可以作为对象的属性名存在,这种属性称之为符号属性
    • 开发者可以通过精心的设计,让这些属性无法通过常规方式被外界调用。
    • 符号属性是不能枚举的,因此在 for - in 循环中无法读取到符号属性,Object.keys 方法也无法读取到符号属性。
    • Object.getOwnPropertyNames 尽管可以得到所有无法枚举的属性,但是仍然无法读取到符号属性
    • ES6 新增 Object.getOwnPropertySymbols 方法, 可以读取符号
  • 符号无法被隐式转换,因此不能被用于数学运算、字符串拼接或其它隐式转换的场景,但符号可以显示的转换为字符串,通过 String 构造函数进行转换即可,console.log 之所以可以输出符号,是它在内部进行了显示转换

共享符号 Symbol.for()

Symbol.for(), 将 symbol 符号变为共享的,外面可以访问到的。

-实现原理;
const commonSymbol = (() => {
    const global = {};
    return function(name) {
        if (!global[name]) {
            global[name] = Symbol(name);
        }
        return global[name];
    };
})();

你可能感兴趣的:(ES6 符号)