Символы JavaScript не останавливают конфликты имен в объектах - PullRequest
0 голосов
/ 12 июня 2018

Я начал смотреть на символы в 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])

Насколько я вижу из своего кода, я все еще могу перезаписать свойства объекта?Так как же помог Символ?

Я неправильно их использую?

1 Ответ

0 голосов
/ 12 июня 2018

Создается впечатление, что у вас создается впечатление, что каждый раз, когда вы получаете доступ к address, будет назначаться новое и другое значение символа, что неверно.

Все, что вы делаете, - это использование символа для генерацииуникальное значение, а затем вы сохраняете это значение в переменной 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 было бы предотвращение создания другим * новым * 1018 другим разработчиком.* ключ к существующему объекту с тем же именем, что и ключи, которые были сделаны из других символов:

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