Symbol 值通过Symbol函数生成。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol函数前不能使用new命令,否则会报错;
由于 Symbol 值不是对象,所以不能添加属性。本质上,它是一种类似于字符串的数据类型;
Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,方便区分
Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的
Symbol 值不能与其他类型的值进行运算,会报错
Symbol 值作为对象属性名时,不能用点运算符, 使用[]
在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
Symbol 值作为属性名时,该属性还是公开属性,不是私有属性
Symbol 作为属性名时属性不会出现在for...in、for...of循环中,
也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
但是,它也不是私有属性,使用Object.getOwnPropertySymbols方法可以获取指定对象的所有 Symbol 属性名。
Symbol.for()
let a1 = Symbol.for('123');
let a2 = Symbol.for('123');
基础数据类型的扩展
总结(摘抄)一下关于基础数据类型的扩展, 即属性和方法...
String 扩展
Number 扩展
平时用的也不多...
Symbol类型
Symbol 值通过Symbol函数生成。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
a1 === a2 // true
// Symbol.for()与Symbol()这两种写法,都会生成新的Symbol。 // 它们的区别是,前者会被登记在全局环境中供搜索,后者不会 Symbol.keyFor(a1) // "123" let c2 = Symbol("f"); Symbol.keyFor(c2) // undefined