joken-前端工程师

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

概论

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")

image


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函数创建.

posted on 2024-06-30 23:21  joken1310  阅读(10)  评论(0编辑  收藏  举报