我已经开始查看 JavaScript 中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?我很难理解 JavaScript 中符号的意义。人们谈论了很多它们,人们说它们很出色,因为它们不会在对象中引起命名冲突,但我看不出如何?
// Create your object
let obj = {};
// Create your Symbol
let address = Symbol("the address symbol");
// Assign your Symbol as a key to a value
obj[address] = "123 Bond street";
// Return '123 Bond street'
console.log(obj[address])
// Another dev comes along
// Assigns an address property to your object
obj[address] = "456 Regent street";
// Your address property has been overwritten?
console.log(obj[address])
据我从代码中看到,我仍然可以覆盖对象的属性?那么符号有什么帮助呢?
我用错了吗?
似乎您的印象是每次访问address
都会分配一个新的和不同的符号值,这是不正确的。
您所做的只是使用 Symbol 生成一个唯一值,然后将该值存储在address
变量中。这意味着,当您稍后再次使用它时,您将使用之前生成的相同符号。即使您不使用 Symbol,情况也是如此:
let obj = {}; // Create your object
let address = "some key name";
obj[address] = "123 Bond street";
console.log(obj[address]); // Return '123 Bond street'
// Another dev comes along
obj[address] = "456 Regent street"; // Assigns an address property to your object
console.log(obj[address]); // Your address property has been overwritten
简而言之,如果您存储一个符号,您所做的只是存储了一个保证是唯一的值。但是,这并不能阻止您一遍又一遍地使用它。
Symbol
更合适的用途是防止其他开发人员在现有对象上创建新键,该键的名称与从其他符号创建的键相同:
let obj = {}; // Create your object
let address = Symbol("some key name");
obj[address] = "123 Bond street";
console.log(obj[address]); // Return '123 Bond street'
// Another dev comes along
let newProp = Symbol("some key name");
obj[newProp] = "456 Regent street"; // Guaranteed unique new key is created
// There is no way the two properties would ever overwrite each other because each
// was created from a different Symbol
console.log(obj[address]);
console.log(obj[newProp]);