与变量引用/赋值混淆

时间:2014-12-15 02:08:45

标签: javascript node.js

我想我最能解释一下我对代码的困惑:

var options = {};
exports.options = options;
exports.options.a = 'a';
console.log(exports.options, options);

exports.options = {};
console.log(options, exports.options);

在第一个输出上:

{ a: 'a' } { a: 'a' }

很好,看起来对exports.options所做的任何操作都会对options完成!但在第二个输出上:

{ a: 'a' } {}

发生什么事了?为什么options也不是{}?我能做些什么?#34;空" exports.options也会清空options


同样如下:

options = {};
console.log(options, exports.options);

哪个输出:

{} { a: 'a' }

3 个答案:

答案 0 :(得分:1)

当你这样做时,

exports.options = options;

您要将与options关联的对象的参考分配给exports.options

再次更改时,

exports.options = {};

您正在为exports.options分配新引用而不更改options

答案 1 :(得分:0)

您可以通过以下代码了解

var options = {};  // Let's say Ref1
exports.options = options; // Ref1 passed to exports.options
exports.options.a = 'a'; // still Ref1 
console.log(exports.options, options); // So both will be updated
exports.options = {}; // New reference say Ref2, which has nothing to do with Ref1
console.log(options, exports.options); // Therefore changing Ref2 doesn't affect Ref1

当您执行exports.options = {};时,将销毁第一个引用并存储新引用,该引用绝不会连接到第一个引用。因此options具有单独的引用,仍然代表{a : 'a'}不会受到影响。

答案 2 :(得分:0)

在处理引用变量(包括指向对象的变量)时,将变量视为包含值的会有所帮助。

您从一个名为options的框中开始,该框中包含一个空对象。您还有一个名为exports的框。在exports框内,您放置了名为options另一个框... ...包含options包含的相同对象(这是物理框类比开始的地方)是紧张的,但想象一下,两个盒子可以包含相同的物理内容。)

变量名称只是写在框中的名称。所以现在你有三个盒子:

  • 包含空对象X的框options(我随意称之为X)
  • 包含exports的邮箱
    • 另一个标有options的框,其中还包含对象X

当您执行作业exports.options = {}时,您所做的只是在该框中添加不同的内容,在本例中为新对象Y.所以现在您已经:

包含空对象X的框options(我随意称它为X) 框exports包含...    另一个标有options的框,其中包含对象Y

因此,您可以看到optionsexports.options选项指向不同的内容,即使它们的名称相同。