ES6:为什么 Symbol 不能有另一个符号作为描述?

Hit*_*mar 2 javascript symbols ecmascript-6

我正在学习 Es6: Symbols。我正在玩它并尝试使用另一个符号作为描述创建一个符号:

var s = Symbol('foo');
console.log(s.toString()); //"Symbol(foo)"
var sS = Symbol(s); // <- thorws error
var sF = Symbol.for(s); // <- thorws error
console.log(s, sA);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么不让我使用现有符号作为描述。当我运行上面的代码时,我看到以下控制台错误:

Uncaught TypeError: Cannot convert a Symbol value to a string
    at Function.for (native)
Run Code Online (Sandbox Code Playgroud)

正如错误所说,它无法将符号转换为字符串。但是正如您在代码(第 2 行)中看到的那样,通过使用toString()函数,我可以将符号转换为字符串。任何人都可以请详细说明发生了什么?谢谢。

Ber*_*rgi 5

为什么不让我使用现有符号作为描述

仅仅因为所有描述都必须是字符串,没有别的。

该错误表示它无法将符号转换为字符串,但通过使用toString()我可以将符号转换为字符串

是的,您可以显式地将符号转换为字符串并使用该toString方法获取其描述。但是所有隐式转换都会抛出异常——这是一个故意的特性,以防止我们意外地使用非唯一描述而不是符号,例如,在使用属性键进行字符串连接时。

  • 更详细一点,[`String()` 的参数将应用内部函数`ToString`](http://www.ecma-international.org/ecma-262/6.0/#sec-symbol -描述)。如果它几乎是符号以外的任何东西,那就没问题 - 描述将是它的文本表示 - 所以 `Symbol(1)`、`Symbol({a:"b"})` 和 `Symbol(undefined )`所有工作。然而,当给定一个符号时,`ToString()` 被[定义为抛出异常](http://www.ecma-international.org/ecma-262/6.0/#sec-tostring)。`Symbol.prototype.toString` 工作,但内部的 `ToString` 不是矛盾。 (3认同)