javascript ECMAScript 6 中符号的用途是什么?
What is the use of Symbol in javascript ECMAScript 6?
符号在javascript(ECMASCRIPT6)中有什么用?
为什么下面的例子 return 错误?
const symbol1 = Symbol();
console.log(Symbol('foo') === Symbol('foo'));
// expected output: false
Every symbol value returned from Symbol()
is unique.
这意味着 ===
比较将失败,因为它们 不相同。
如果您想要某种可以赋予描述性的唯一标识符,否则不相关的名称,那么 Symbol 可能会有用。
Symbol
用于创建一个完全唯一的 one-of-a-kind 标识符。它的用途正是针对您列出的示例。
即使您使用相同的字符串调用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' };
符号的想法是将私有属性引入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
符号在javascript(ECMASCRIPT6)中有什么用?
为什么下面的例子 return 错误?
const symbol1 = Symbol(); console.log(Symbol('foo') === Symbol('foo')); // expected output: false
Every symbol value returned from
Symbol()
is unique.
这意味着 ===
比较将失败,因为它们 不相同。
如果您想要某种可以赋予描述性的唯一标识符,否则不相关的名称,那么 Symbol 可能会有用。
Symbol
用于创建一个完全唯一的 one-of-a-kind 标识符。它的用途正是针对您列出的示例。
即使您使用相同的字符串调用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' };
符号的想法是将私有属性引入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