【ES6】 Symblo

110 阅读1分钟

概述

  • 符号是ES6新增的一个基本数据类型,它通过使用函数Symbol(符号描述) 来创建
  • 符号设计的初衷,是为了给对象设置私有属性
    • 私有属性:只能在对象内部使用,外面无法使用

语法

直接使用Symbol() 创建新的 symbol 类型,并用一个可选的字符串作为其描述

Symbol([description])

符号特点

  • 没有字面量
  • 使用 typeof 得到的类型是 symbol
  • 每次调用 Symbol 函数得到的符号永远不相等,无论符号名是否相同,每个从Symblo()返回的symblo都是唯一的
  • 符号可以作为对象的属性名存在,这种属性称之为符号属性
    • 我们可以通过精心的设计,让这些属性无法通过常规方式被外界访问
    • 符号属性是不能枚举的,因此在 for-in 循环中无法读取到符号属性,Object.keys 方法也无法读取到符号属性
    • Object.getOwnPropertyNames 尽管可以得到所有无法枚举的属性,但是仍然无法读取到符号属性
    • ES6 新增 Object.getOwnPropertySymbols 方法,可以读取符号
  • 符号无法被隐式转换,因此不能被用于数学运算、字符串拼接或其他隐式转换的场景,但符号可以显式的转换为字符串,通过 String 构造函数进行转换即可,console.log 之所以可以输出符号,是它在内部进行了显式转换
const sym = Symbol()
const sym2 = Symbol(2)
const sym3 = Symbol('abc')

console.log(typeof sym)  // symbol
console.log(sym2 === 2)  // false
console.log(sym3.toString()) // Symbol(abc)

共享符号

  • 根据某个符号名称(符号描述)能够得到同一个符号
Symbol.for("符号名/符号描述") //获取共享符号
const sym = Symbol.for('zero')
const sym2 = Symbol.for("zero")
console.log(sym === sym2)  // true