Javascript 中的符号如何显示?

How are symbols displayed in Javascript?

如果我说 sym1 = Symbol();Symbol 函数是否像下面的函数 g

一样工作
> g = function(){
|     return 2; //return some random unique value based on some internal algo
| }
    g()
> var sym1 = g();
> sym1
    2

现在,当我执行 var sym1 = Symbol(); 并记录 sym1 时,控制台显示 Symbol() 而不是 Symbol 函数返回的值。

所以这是我的问题:Symbol 函数是如何工作的?当您键入 sym1 时,控制台如何能够显示 Symbol() 而不是某些值?我们可以写这样的函数吗?

Is window['Symbol'] function working like below function g,

不确定实际问题?虽然,出现"no"

Here is the confusion, when I say, > sym1 console displays Symbol() instead of displaying the value returned by function Symbol

Symbol() 不是 return 一个 function ,而是一个 "unique and immutable data type and may be used as an identifier"

Symbol

A symbol is a unique and immutable data type and may be used as an identifier for object properties. The symbol object is an implicit object wrapper for the symbol primitive data type.

var sym = Symbol("foo");
var obj = {};
obj[sym] = 1;
console.log(obj.sym); // `undefined`
console.log(Object.keys(obj)) // `[]`
console.log(obj[sym]); // `1`

另见 ES6 In Depth: Symbols

是的,Symbol只是一个函数,类似于1到任意的function g() { return something }.

但是,与您问题中的示例 g 不同,它不是 return 数字,而是 symbols,这是 ES6 中新的原始值类型。

When I say sym1, console displays Symbol() instead of displaying the value returned by function Symbol.

您认为 returned 的价值是多少,您认为应该如何显示?

您的 g 函数 returned 的数字只是一些 64 位 2 的集合。不知何故3,控制台从中导出一个以 10 为基数的字符串,以显示带有您期望的数字的数字。

现在,什么是符号?它只是一个具有标识的值,我们甚至不知道它是如何实现的。目前尚不清楚如何显示,或者是否显示。它不是数字,也不是字符串。也许是某种 id4?

然而 ES6 对此采取了预防措施,每个符号都被赋予一个 description string5 that can be passed as an optional argument to the Symbol function. Also, ES6 does specify how symbols should be displayed as string in §19.4.3.2。这通常是控制台使用的内容。

这个 "descriptive string" 与调用 Symbol 的方式非常相似,例如

var sym1 = Symbol("my description");
console.log(sym1.toString()); // "Symbol(my description)"
console.log(sym1); // Symbol(my description)<sup>6</sup>
var sym2 = Symbol();
console.log(sym2.toString()); // "Symbol()"
console.log(sym2); // Symbol()<sup>6</sup>

1: 但是,它是一个普通函数,不是构造函数,不能用 new.
调用 2:加上某种类型信息,它是一个数字,给64位一个意义
3:明确地说,控制台在遇到数字
时可能会使用.toString for numbers 4: Chrome 当你使用开发工具拍摄堆快照时,为每个对象显示这样的信息,例如
5:是的,它不仅仅是独特的身份
6:取决于实现,取决于你的console