【前端技术】Symbol是什么,什么场景用

一、Symbol是什么

Symbol 是原始数据类型的即 symbol 类型,不能使用new命令创建而是通过 Symbol 函数生成,表示独一无二的值。
let s1 = Symbol(), s2 = Symbol()
console.log(s1===s2)// false
console.log(typeof s1)// 'symbol'
生成一个 Symbol 值时调用 Symbol 函数,而它也可以接收一个字符串作为参数,表示为 Symbol 值的标识,这样做的目的是利于区分。Symbol() 的参数只是表示当前值的标识,因此相同参数的 Symbol 的返回值是不相等的
let s1 = Symbol(), s2 = Symbol()
console.log(s1)//Symbol
console.log(s2)//Symbol
console.log(s1===s2)//false
let s3 = Symbol('foo'), S4 = Symbol('foo')
console.log(s3)//Symbol(foo)
console.log(s4)//Symbol(foo)
console.log(s3 === s4)//false
值得注意的是 Symbol 值作为对象属性时,不能使用点运算符,只能使用中括号,因为中括号内是表达式,可解析为 Symbol 值使用。Symbol作为属性名,该属性不会出现在 for…in 、for…of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名(以数组形式排列)。
let a = {}
let x = Symbol()
a[x] = 'hello'
console.log(a[x])//hello
console.log(a.x)//undefined

let b = { x:1, y:2 }
let z = Symbol()
a[z] = 'hello'
for(key in b){
  console.log(key,b[key])
  // x 1
  // y 2
}
console.log(Object.getOwnPropertySymbols(b))//[Symbol()]
Symbol()每次被调用都会生成一个新的 Symbol (内置写法没有登记机制,所以每次调用都会返回一个不同的值)。
Symbol.for(key) 方法会根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。
Symbol.keyFor(sym) 方法用来获取全局 symbol 注册表中与某个 sym 关联的键。Symbol.for(key)创建的才行
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
Symbol.prototype.toString() 方法返回当前 symbol 对象的字符串表示。
Symbol.prototype.valueOf() 方法返回当前 symbol 对象所包含的 symbol 原始值。
Symbol("foo").toString() + "bar"
// "Symbol(foo)bar"

Object(Symbol("foo")).valueOf() + "bar";
// TypeError:  can't convert symbol to string
// 手动调用 valueOf() 方法,虽然转换成了原始值,但 symbol 原始值不能转换为字符串
Object(Symbol("foo")).toString() + "bar";
// "Symbol(foo)bar",需要手动调用 toString() 方法才行
posted @ 2023-07-13 14:19  前端bug制造机  阅读(364)  评论(0)    收藏  举报