在下面的示例中,在集合B上调用.add()方法时,集合A也受到影响:
A = {0,1,3,4,5}
B = A
B.add(10)
我之所以这样是因为A和B都指向同一个集合对象。
但是,在这种稍有不同的情况下,集合A不受影响:
A = {0,1,3,4,5}
B = A
B = B - {0,1}
在第二个示例中,为什么要创建一个新对象供B指向?是什么解释了这种行为差异?
答案 0 :(得分:1)
关于第一种情况,您绝对正确-const commandFiles = readdirSync(join(__dirname, "commands")).filter((file) => file.endsWith(".js"));
for (const file of commandFiles) {
const command = require(join(__dirname, "commands", `${file}`));
client.commands.set(command.name, command);
}
和A
是同一对象。
对于第二个示例,表达式B
正在创建一个新集合。该新集合将被分配回B - {0,1}
,所以现在B
与B
不再相同。
答案 1 :(得分:1)
在第一种情况下,是的,A
和B
是同一对象的别名,因此在两个别名上都可以看到通过一个别名进行的变异。
在第二种情况下,B - {0,1}
正在创建一个全新的set
对象,而B =
是重新绑定名称B
的对象(任何每当您看到plainname = somethingelse
时,绑定到plainname
的对象都无所谓;现在又反弹到新的东西),因此它不再是与A
相同的集合的别名。您可以执行以下操作来将B
进行适当的突变,从而使A
也发生变化:
B -= {0,1}
由于set
实现了变异的就地减法运算,该运算为-=
(而不是-
)调用。