JavaScript 符号并不能阻止对象中的名称冲突

2024-05-27

我已经开始研究 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是为了防止其他开发人员创建new现有对象上的 key 与其他 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]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 符号并不能阻止对象中的名称冲突 的相关文章

随机推荐