Symbol

Posted mcgee0731

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symbol相关的知识,希望对你有一定的参考价值。

Symbol类型

Symbol新的原始数据类型 (符号)表示独一无二的值

对象的key可以使用Symbol

具有静态属性和静态方法 不支持 new Symbol()

解决不同文件使用公共变量,互相影响,

//shared.js ==================================
const cache = {}

//a.js ======================================
//cache[\'a_foo\']  || cache[\'b_foo\'] 以前的做法,约定好不同文件下的key,但是本质上并没有解决问题只是规避了问题
cache[\'foo\'] = "VLAUE"  

//b.js ========================================
cache[\'foo\'] = "VALUE1111"
const s = Symbol()
console.log(s); //Symbol()
console.log(typeof s); //symbol
console.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false false
console.log(Symbol("aa"),Symbol("bb")) //描述文本 Symbol(aa) Symbol(bb)

可以添加为属性名

const obj1 = {
  [Symbol()]:123
}
console.log(obj1);

案例

//创建私有变量
const name = Symbol()
const person = {
  [name]:"zxa",
  say(){
    console.log(this[name]);
  }
}

//b.js
// person[Symbol()] //无法创建完全相同的Symbol,取不到成员
person.say() //可以拿到普通成员

静态方法

const s1 = Symbol.for() //内部维护了一个全局的注册表,为添加的标识字符串和Symbol值提供一一对应,下次再搜所给定key反现有symbol会返回不会新创建
const s2 = Symbol.for()
console.log(s1 === s2); //true 如果添加描述字符串,则添加的描述字符串必须一致才true
 
console.log(Symbol.for(true) === Symbol.for("true")); //true 会转化成字符串

注意Symbol作为key取不到

console.log(cache); //{ foo: \'VALUE1111\', [Symbol()]: 100, [Symbol()]: 200 }

for (var key in cache){
  console.log(key); //拿不到Symbol的key         foo
}
console.log(Object.keys(cache)) // [ \'foo\' ]
console.log(JSON.stringify(cache)); // {"foo":"VALUE1111"}
//单独取Symbol()的方法
console.log(Object.getOwnPropertySymbols(cache)); //[ Symbol(), Symbol() ]

以上是关于Symbol的主要内容,如果未能解决你的问题,请参考以下文章

python实现逆波兰计算表达式的代码

EXPORT_SYMBOL使用

谈EXPORT_SYMBOL使用

为啥我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol);

symbol微信小程序怎么调整颜色

EOS 智能合约源代码解读 symbol.hpp