JavaScript符号不会阻止对象中的名称冲突
我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?我很难理解JavaScript中符号的意义。人们经常谈论它们,人们说它们很出色,因为它们不会在对象中引起命名冲突,但我不知道怎么做JavaScript符号不会阻止对象中的名称冲突,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?我很难理解JavaScript中符号的意义。人们经常谈论它们,人们说它们很出色,因为它们不会在对象中引起命名冲突,但我不知道怎么做 //创建您的对象 设obj={}; //创建您的符号 让地址=符号(“地址符号”); //将符号指定为值的键 obj[地址]=“邦德街123号”; //返回‘邦德街123号’ console.log(obj[地址]) //另一个开发人员出现了
//创建您的对象
设obj={};
//创建您的符号
让地址=符号(“地址符号”);
//将符号指定为值的键
obj[地址]=“邦德街123号”;
//返回‘邦德街123号’
console.log(obj[地址])
//另一个开发人员出现了
//为对象指定地址属性
obj[地址]=“摄政街456号”;
//您的address属性已被覆盖?
console.log(obj[address])
您似乎感觉每次访问address
时都会分配一个新的不同的符号值,这是不正确的
您所做的只是使用Symbol生成一个唯一的值,然后将该值存储在address
变量中。这意味着,当您以后再次使用它时,您使用的是先前生成的相同符号。即使您没有使用符号,也会出现这种情况:
let obj={};//创建您的对象
让address=“某个键名”;
obj[地址]=“邦德街123号”;
console.log(obj[地址]);//返回‘邦德街123号’
//另一个开发人员出现了
obj[地址]=“摄政街456号”//为对象指定地址属性
console.log(obj[地址]);//您的address属性已被覆盖
当然您正在覆盖该属性。您创建的符号存储在地址中,然后您将该键设置两次。您的代码只需生成一个动态唯一符号,然后将其静态存储。它将停止obj.address=“456 Regent street”
@dandavis当然会,因为address
从一开始就不是键名。@ScottMarcus:对,如果你控制对该本地的访问,你就控制对道具的访问……你需要创建第二个符号:const address2=Symbol(“地址符号”)代码>。如果您的代码实际上避免了名称冲突,您将如何更新使用符号键存储的属性?Hi@ScottMarcus,是否可以同时显示上一个使用字符串而不是符号进行比较的示例,并解释如何覆盖字符串键,因为我无法理解,(我已经用字符串写出了代码,但是结果是一样的,我无法理解有可能覆盖属性的情况,我的意思是我知道如果有人试图创建一个现有的字符串变量属性,它将覆盖现有的字符串变量属性,但是如果他们创建另一个符号并将其分配给e原始变量)。谢谢。@Zippy我不确定我是否遵循了。如果不使用符号,上面的示例将大致相同,只需删除新符号(“某个键名”)
,并将其替换为“某个键名”
。问题是有人可能会使用已经使用过的相同密钥名,因此会覆盖密钥中的内容。@ScorrMarcus,谢谢你的回答。我的意思是,我看到的每个示例都显示有其他人出现并试图创建对象的属性,比如说该属性已经存在的“年龄”。如果e然后访问“age”,然后它将返回新值(这是预期的),但是它们随后使用符号显示类似的示例,但是当尝试创建新属性(如果存在)时,它们总是使用不同的变量名显示它们,这显然不会覆盖原始名称。如果仍然不清楚,则表示歉意。我只是很难解决所有问题!谢谢。这正是我的上一个示例所显示的。第一个属性名由符号生成,并存储在地址
变量和seco中nd property name是由不同符号生成的不同值,存储在newProp
变量中。