symbol类型

synbol类型为es6新增数据类型,被划分到了基本数据类型中。

表示一个唯一的值。

格式为:

 let xxx = symbol('标识');

symbol('')中的标识仅用于区分,无特殊意义,如果需要读取标识的话可以将symbol类型转换为字符串或者布尔值。

symbol类型也可用作对象的key:

//后面的括号可以给symbol做上标记便于识别
let name=Symbol('name');
let say=Symbol('say');
let obj= {
  //如果想 使用变量作为对象属性的名称,必须加上中括号,.运算符后面跟着的都是字符串
  [name]: 'lnj',
  [say]: function () {
    console.log('say')
  }
}
obj.name='it666';
obj[Symbol('name')]='it666'
console.log(obj)

打印出来的内容中会多出一个键值对name: 'it666';

obj[Symbol('name')]的值不会改变。而是会创建一个新的参数:symbol[name]:'it666'。

symbol的值不可以做运算,并且symbol类型只可以转换为string 或者 Boolean

console.log(String(name))

console.log(Boolean(name))

当使用symbol生成的值作为属性或者方法时需要保存下来,不然可能无法使用。因为symbol每次生成的值都是不同的

symbol作为obj的属性名的时候无法通过for循环遍历出来

for (let xx in obj) :i代表key
for (let xx of obj):不是自带的哈
Object.keys(obj) :返回包含key的数组
Object.values(obj) :返回包含value的数组
Object.getOwnPropertyNames() :返回包含key的数组
上述的所有方法都是遍历不到symbol类型的(注意,是遍历时取不到symbol,并不是说我们访问不到对象的symbol类型)

可以遍历到symbol的方法:

Object.getOwnPropertySymbols() :返回对象中只包含symbol类型key的数组
Reflect.ownKeys() :返回对象中所有类型key的数组(包含symbol)

只可以通过Reflect.ownKey(obj)或者Object.getOwnPropertySymbols(obj)来遍历。但是仍旧可以通过obj[symbol的标识]来访问到对应的参数。

因为symbol类型每次都会生成不同的值,所以symbol自带了一个for方法来接受一个字符串为标识,自动去搜寻此标识,如果有以此标识作为名字的值则会返回这个值,如果没有就会生成一个新值。并将其注册到全局

let s1 = Symbol('foo');
let s2 = Symbol('foo');

s1 === s2 // false

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

除此之外还有一个获取标识的方法keyFor,由于Symbol()写法没有登记机制,所以每次调用都会返回一个不同的值。Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

let s1 = Symbol.for("foo"); // 利用for()生成,已注册
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo"); // 未注册
Symbol.keyFor(s2) // undefined

 

posted @ 2022-07-12 17:33  妄欢  阅读(212)  评论(0编辑  收藏  举报