参考https://blog.csdn.net/darabiuz/article/details/121962153
Symbol的方法
Symbol()每次被调用都会生成一个新的Symbol,写法没有登记机制,所以每次调用都会返回一个不同的值
Symbol.for()不会每次调用就返回一个新的Symbol,而是会先检查给定的key是否已经存在,如果不存在,则会在全局创建并注册这个key,然后才会新建一个Symbol值
Symbol.keyFor()方法返回一个已经登记的Symbol类型值的key
// Symbol()
let s1 = Symbol('s')
let S2 = Symbol('s')
console.log(s1)//Symbol(s)
console.log(s2)//Symbol(s)
console.log(s1 === s2)//false
//Symbol.for()
let s1 = Symbol.for('s')
let s2 = Symbol.for('s')
console.log(s1)//Symbol(s)
console.log(s2)//Symbol(s)
console.log(s1 === s2)//true
//Symbol.keyFor()
let s1 = Symbol('s')
let s2 = Symbol.for('s')
Symbol.keyFor(s1)//undefined
Symbol.keyFor(s2)//s
作用
1、避免重复命名问题
2、消除魔术字符串(代码中多次出现,与代码形成强耦合的某一字符串或数值)
3、为对象定义一些非私有的、但又希望只用于内部的方法。
1、避免重复命名问题
定义Symbol类型的变量时,由于Symbol是唯一的所以可以避免重复命名
Symbol()的参数只是表示对于当前Symbol值得描述,因此相同参数的Symbol的返回值是不相等的
let s1 = Symbol('foo')
let S2 = Symbol('foo')
console.log(s1)//Symbol(foo)
console.log(s2)//Symbol(foo)
console.log(s1 === s2)//false
2、消除魔术字符串
个人理解
//平时
function test(val){
if(val == 'tmd'){
console.log("我是业务逻辑")
}
}
test('tmd')//我是业务逻辑
//Symbol(错误示范)
function test(val){
if(val == Symbol('tmd')){
console.log("我是业务逻辑")
}
}
test(Symbol('tmd'))//undefined
//Symbol(正确示例,消除魔法字符串)
let temp = Symbol('tmd')
function test(val){
if(val == temp){
console.log("我是业务逻辑")
}
}
test(temp)//我是业务逻辑
3、为对象定义一些非私有的、但又希望只用于内部的方法。
let name=Symbol('name');
let obj={
[name]:'lnj',
age:12,
teacher:'wyx'
}
for(let key in obj){
console.log(key) //只能打印出age和teacher
}
//这个方法可以单独取出Symbol(name)
console.log(Object.getOwnPropertySymbols(obj))
标签:基本,console,log,s2,Symbol,数据类型,let,s1
From: https://www.cnblogs.com/9zhe/p/17502501.html