Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript符号不会阻止对象中的名称冲突_Javascript_Ecmascript 6_Symbols - Fatal编程技术网

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

JavaScript符号不会阻止对象中的名称冲突,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?我很难理解JavaScript中符号的意义。人们经常谈论它们,人们说它们很出色,因为它们不会在对象中引起命名冲突,但我不知道怎么做 //创建您的对象 设obj={}; //创建您的符号 让地址=符号(“地址符号”); //将符号指定为值的键 obj[地址]=“邦德街123号”; //返回‘邦德街123号’ console.log(obj[地址]) //另一个开发人员出现了

我已经开始研究JavaScript中的符号,并开始在我的对象中使用它们来帮助解决名称冲突,但我仍然可以在使用它们时覆盖属性?我很难理解JavaScript中符号的意义。人们经常谈论它们,人们说它们很出色,因为它们不会在对象中引起命名冲突,但我不知道怎么做

//创建您的对象
设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
变量中。