JavaScript学习笔记(一)JS的数据类型(3)

时隔多日,在写完四个实验三个实验报告脱皮的开学第一周之后,我又开始写博客了。
依旧是接着上次的数据类型的总结。这次是symbol。在看了几篇博客之后,我对symbol大致有了一点模糊的理解。它是有点类似于给一个字符串,或者一个对象或者什么东西一个身份证。这个身份证是不能重复的,每个人只能有一个。
由于很多博客写的太乱了。这一部分参照MDN的手册来总结。

  • symbol的创建:
var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');

symbol是不能用new来创建的。
同时,由于symbol需要保证唯一性,及时是用同样的参数进行创建,得到的symbol值也是不一样的。

const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

console.log(typeof symbol1);
// expected output: "symbol"

console.log(symbol3.toString());
// expected output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

在第二个的输出结果中,我们可以发现,当输出symbol3 的时候,并不能输出生成的symbol的值,而是输出了表达式。
在MDN中,是这样描述的:A description of the symbol which can be used for debugging but not to access the symbol itself.也就是说,只能用来debug不能直接访问这个值。
同时

  • Symbol.for()和Symbol.keyFor()
    上述symbol()方法创建的symbol只是一个局部变量,如果想要创建能够被全局引用的symbol,则需要使用Symbol.for()和Symbol.keyFor().
    Symbol.for()函数首先检索所有的symbol存储器,如果相关参数的symbol已经被创建过了,则不再创建新的symbol,只返回这个已经被创建的symbol。
    如果没有被创建过,则创建一个新的symbol并返回。
console.log(Symbol.for('bar') === Symbol.for('bar'));
// expected output: true

console.log(Symbol('bar') === Symbol('bar'));
// expected output: false

const symbol1 = Symbol.for('foo');

console.log(symbol1.toString());
// expected output: "Symbol(foo)"

Symbol.keyFor()函数需要输入一个symbol参数,函数的返回值为这个symbol的key。

var globalSym = Symbol.for('foo'); // create a new global symbol
Symbol.keyFor(globalSym); // "foo"

var localSym = Symbol();
Symbol.keyFor(localSym); // undefined

// well-known symbols are not symbols registered 
// in the global symbol registry
Symbol.keyFor(Symbol.iterator) // undefined

猜你喜欢

转载自blog.csdn.net/shadothew/article/details/87734838