【问题标题】:How symbols helps to avoid name collision in object in js?符号如何帮助避免 js 中对象中的名称冲突?
【发布时间】:2022-01-17 15:20:27
【问题描述】:

由于符号是唯一标识符,它们可以帮助我们避免覆盖对象中的同名属性。

就像假设一样,有一个名为 user 的对象被用于许多不同的程序中。

let user = {
     name :  "ram",
     id : 5,
};

所以现在,假设这个用户对象在另一个程序中使用(我们称之为 pro1),如果我们想给它添加一个名为 id 的属性,我们将使用符号 id,像这样 -

let id = Symbol();
user[id] = 2;

所以之前的 id 属性不会被覆盖在用户对象中。

但现在假设,

如果用户对象已经有symbol id属性,并且在另一个没有定义symbol id的程序中使用,那么就会出现错误,因为symbol id没有定义。

那么我的问题是符号如何帮助避免 JavaScript 中对象中的命名冲突????

我真的无法理解它背后的概念。请澄清一下。

【问题讨论】:

  • 请注意let id = Symbol(); user[id] = 2; 不会将值2 分配给user.id
  • 第二个程序也可以执行let id = Symbol(); user[id] = 3;,这样就可以了。现在将有两个符号属性 - 一个设置在 2,另一个设置在 3
  • 每个新符号都是独一无二的,所以你可以这样做user = { [Symbol()]: 2, [Symbol()]: 2 },它是有效的......但毫无意义
  • 我不明白您所说的“它用于另一个未定义符号 id 的程序”是什么意思。能详细点吗?
  • @HimanshuRai 不,没有错误。该对象中只有一个未使用的属性,程序对此一无所知,即使偶然也不会尝试访问。

标签: javascript object symbols


【解决方案1】:

以一个应用程序为例,它有一些关于专辑的数据,并用这些数据填充。 (警告:接下来的一切都被大量简化和高度设计)。

假设我们有一个模块用于“与我的朋友分享我的音乐品味”和“订购歌曲”,两个模块都希望将曲目标记为已处理,这样您就不会最终得到复制副本或多次向您的朋友大喊。

模块可能如下所示:

const processed = Symbol('processed');

function shareWithFriends(track) {
    if (track[processed]) { return };
    /* do suff */
    track[processed] = true;
}

export default shareWithFriends;

那么你可以:

import shareWithFriends from './shareWithFriends.js';
import orderSong from './orderSong.js';

const song = { /* meta data */ };

shareWithFriends(song);
orderSong(song);

两个模块都可以修改元数据而不会误读其他模块的已处理符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多