JavaScript 符号并没有阻止对象中的名称冲突

标签 javascript ecmascript-6 symbols

我已经开始研究 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])

就我的代码而言,我仍然可以覆盖对象的属性吗?那么 Symbol 有什么帮助呢?

我用错了吗?

最佳答案

您的印象似乎是每次访问 address 时都会分配一个新的不同的 Symbol 值,这是不正确的。

您所做的只是使用 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,您只不过是存储了一个保证唯一的值。但是,这并不能阻止您一遍又一遍地使用它。

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]);

关于JavaScript 符号并没有阻止对象中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50806000/

相关文章:

javascript - Aptana 支持 ES6 吗?

ruby - 使用 Ruby 符号

android - 无法解析符号android studio

javascript - 在 mysql 连接查询的结果上过滤 v-for

javascript - ember.js 在为其属性设置新值后应用对象

javascript - IFrame 与 Script.. 哪个更适合调用游戏关卡?

javascript - ES6 动态 Import() 与 AMD require()

javascript - 是否使用 let 或 const 提升了声明的变量?

javascript - 如何在 ES5 中使用转译后的 ES6?

java - 找不到符号,我不知道为什么