javascript(ECMASCRIPT6)中符号的用途是什么?
为什么以下示例返回false?
const symbol1 = Symbol(); console.log(Symbol('foo') === Symbol('foo')); // expected output: false
答案 0 :(得分:6)
{{1}}返回的每个符号值都是唯一的。
这意味着{{1}}比较将失败,因为它们不是相同的。
如果你想要一种可以给出描述性的唯一标识符,如果不相关的名称,那么符号可能是有用的。
答案 1 :(得分:4)
Symbol
用于创建完全唯一的,独一无二的标识符。它的使用正是您列出的例子。
即使您使用相同的字符串调用Symbol
,实例也会有所不同。这允许不同的库(可以同时使用)来定义可以同时使用的密钥。
例如,假设两个库使用通用名称来定义window
或global
上的内容(或者为了说明,假全局door
):
const door = {};
// from library 1
door.cake = () => console.log('chocolate');
// from library 2
door.cake = () => console.log('vanilla');
// your code
door.cake();

在此示例中,第一个库代码丢失,因为它无意中被赋予与第一个库相同的名称。
现在,如果它们都使用Symbol
,那么即使它们的名称相同,您仍然可以访问它们(假设它们以某种方式导出Symbol
):
const door = {};
// library 1
const cake1 = Symbol('cake');
door[cake1] = () => console.log('chocolate');
// library 2
const cake2 = Symbol('cake');
door[cake2] = () => console.log('vanilla');
// your code
door[cake1]();
door[cake2]();

两者仍可访问。
这有点过于简单化了,但它说明了这一点。
在更实际的用法中,这些用于导入模块等内容。模块最终可能会使用相同的名称,但这样可以,因为它们具有与之关联的唯一符号,只要您拥有Symbol
个对象,就可以使它们唯一可访问。
至于何时自己使用它们......它可能会非常罕见。只要您有办法提供Symbol
但需要其他东西保持独特,您主要想要使用它们。我只是在一些狭窄的情况下直接使用这些,其中创建的元素可能最终相同。
例如,如果您使用名称作为键来创建对象,则可能具有重复的名称。没有符号,对象将覆盖另一个。有了符号,他们都会留下来。
const people = {};
people[Symbol('bob')] = { name: 'Bob Smith' };
people[Symbol('bob')] = { name: 'Bob Jones' };

答案 2 :(得分:1)
符号的想法是将私有属性引入Javascript。但是,它的实际目的是名称冲突。
然而不幸的是,他们最终被严重降级,毕竟不是私人的,因为你可以通过反思找到它们。具体来说,通过Object.getOwnPropertySymbols方法并通过代理。Symbol()返回的每个符号值都是唯一的。符号值可以用作对象属性的标识符;这是数据类型的唯一目的。 (根据mozilla)
var Pet = (function() {
var typeSymbol = Symbol('type');
function Pet(type) {
this[typeSymbol] = type;
}
Pet.prototype.getType = function(){
return this[typeSymbol];
}
return Pet;
}());
var a = new Pet('dog');
console.log(a.getType()); // prints dog
a[Object.getOwnPropertySymbols(a)[0]] = "cat"
console.log(a.getType()); //prints cat