Symbol - 听说用了这个方法就能创建出相同的Symbol值

前言

小伙伴们大家好。上一篇文章我们分享了ES6中新增基本数据类型Symbol的用法及特点。通过上一篇的学习我们知道:用Symbol方法创建出来的Symbol值都是独一无二的,即使传递了一模一样的参数,那么如果有时候我就是想要创建一个相同的Symbol有没有办法呢,答案是肯定的。接下来将给大家分享一个能够创建相同Symbol值的方法。

Symbol的方法

  • Symbol.for()

有时候我们就是希望传递相同的参数就能够创建出相同的Symbol值来使用。Symbol为我们提供了一个方法:Symbol.for(),它接收一个字符串作为参数(可选),然后会在全局中搜索有没有以该参数作为描述的Symbol值,如果有则直接返回该Symbol,否则将以该参数作为描述创建一个新的Symbol值,并将其注册的全局环境供搜索,用Symbol方法创建的Symbol值是不会注册到全局的。

也就是说在使用Symbol.for()创建Symbol值时,首先会到全局环境中检测有没有创建,有就直接返回,没有再去创建新值,而Symbol则不管有没有都是创建新值。

另外:Symbol.for()在创建Symbol值时是登记在全局环境中的,不管有没有在全局环境运行

let s1 = Symbol.for('Yannis');
let s2 = Symbol.for('Yannis');
console.log(s1 === s2); // true

let s3 = Symbol('Yannis');
let s4 = Symbol('Yannis');
console.log(s3 === s4); // false

// 不管在哪里调用,都会被注册登记到全局环境
function foo() {
    
    
  return Symbol.for('Yannis');
}
const x = foo();
const y = Symbol.for('Yannis');
console.log(x === y); // true

上面的代码中,s1、s2、s3、s4都是Symbol值,并且它们的描述也都是一样的,但是用Symbol.for()创建出来的s1和s2实际上是同一值,而用Symbol方法生成的则是完全不同的值。
Symbol.for()与Symbol()这两种写法都能够生成新的 Symbol值。但它们的区别是,前者会被登记在全局环境中供搜索,而后者不会。Symbol.for()不会每次都去创建一个新的 Symbol 值,而是先检查全局环境中是否已经存在,如果不存在才会创建新值。比如,用Symbol.for(“Yannis”)不管调用多少次,最后只有一个Symbol值,而如果换成Symbol(‘Yannis’),那么调用多少次就会生成多少个新的Symbol值,比如调用100次那就是100个全新的Symbol值。

  • Symbol.keyfor()

Symbol还为我们提供了一个keyfor方法,这个方法需要与Symbol.for方法配合使用,因为它是用来获取一个被登记过的Symbol值的key,就是创建Symbol值时的那个字符串描述。

  • keyfor方法接收一个Symbol类型的参数,用于返回该Symbol的key
  • keyfor方法只能返回被登记过的Symbol值的key,也就是说只有通过Symbol.for方法创建的Symbol值的key才会被返回
let s1 = Symbol.for("Yannis");
Symbol.keyFor(s1) // "Yannis"

let s2 = Symbol("Yannis");
Symbol.keyFor(s2) // undefined

上面代码中,通过 Symbol.for(“Yannis”)创建的Symbol值的key “Yannis”被返回了,而用Symbol生成的值返回的确实Undefined。这也进一步印证了keyfor是返回被登记过的Symbol值的key的。

总结

本章我们又掌握了一个新姿势,原来Symbol的值也是可以相同的,关键在于用什么方法去创建。关于Symbol的两个方法就分享到这里了。

喜欢的小伙伴欢迎点赞留言加关注哦!

猜你喜欢

转载自blog.csdn.net/lixiaosenlin/article/details/120865121