概论
Symbol 是一种用于创建唯一标识符的原始数据类型。
Symbol 通常用作对象属性的键,以避免属性名冲突。
Symbol.for() 可以在全局 Symbol 注册表中创建或查找 Symbol。
内置 Symbol 用于定义语言级别的行为和协议。
Symbol 属性与普通属性的区别
Symbol 属性不会出现在普通的对象属性枚举操作中,比如 for...in 循环或 Object.keys() 方法。你可以使用 Object.getOwnPropertySymbols() 获取对象的 Symbol 属性。
测试代码
const sy=Symbol("from")
interface Kkc{
[k:string]:any,
[sy]:string
}
let kkc:Kkc;
kkc={
name:"sfkjsdf",
[sy]:"lnvslkdjfs"
}
console.log(kkc,"kkc")
console.log(kkc[sy],"kkc_sy") //打印获取symbol属性的方式
//新增一个同名的from属性,但是不会影响Symbol("from") 还是一个属性
kkc.from="slfjslkf" //还是可以赋值from属性,不影响原来的Symbol中定义的from属性
// Symbol 不可枚举,所以打印不出symbol对象
for(let k in kkc){
console.log(k,"kkc_key")
}
console.log(kkc,"kkc2")
kkq=Symbol("23423423")
kkq=23423423
console.log(kkq,"kkq")
const sy:unique symbol=Symbol("from")
const sy2:unique symbol=Symbol("from")
interface Kkc{
[k:string]:any,
[sy]:string,
[sy2]:string
}
let kkc:Kkc;
kkc={
name:"sfkjsdf",
[sy]:"lnvslkdjfs",
[sy2]:"slfjslkfjslkfd"
}
console.log(kkc,"kkc")
console.log(kkc[sy],"kkc_sy")
kkc.from="slfjslkf"
for(let k in kkc){
console.log(k,"kkc_key")
}
console.log(kkc,"kkc2")
let kki:symbol=Symbol("child")
console.log(kki,"kki")
let kkd:symbol=Symbol("child")
console.log(kkd,"kkd")
console.log(kki===kkd,"kki===kkd")
/**
* 打印结果
* Symbol(child) 'kki'
myts.ts:406 Symbol(child) 'kkd'
myts.ts:408 false 'kki===kkd'
说明symbol类型的数据是唯一的
*/
console.log(Symbol.for("child"),"get_Symbol")
console.log(Symbol("child")===Symbol("child"),"Symbol('child')===Symbol('child')")
总结
symbol 类型让对象的属性不可能枚举,且唯一且隐式。
创建symbol类型通过Symbol函数创建.
前端工程师、程序员