我试图了解以下原因的工作原理:

鉴于我们有

var _queries = [];

function Query(queries) {
  _queries = this.queries = queries;
}

Query.prototype.add = function add(query) {
  _queries.push(query);
};


其中add操纵_queries而不是this.queries

当我们创建一个新的Query对象时,

var query = new Query(['foo']);
query;
//=> Query { queries: ['foo'], add: function... }
query.add('bar');
query;
//=> Query { queries: ['foo', 'bar'], add: function... }


即使add被操纵,就像barthis.queries中添加了_queries一样。对于我来说,这不直观,原因为何。

最佳答案

那是因为javascript将数组视为参考。

这行代码

 _queries = this.queries = queries;


将使_queriesthis.queries成为指向同一内存数组的指针。

如果您将其更改为此:

 _queries = queries.slice();
 this.queries = queries.slice();


然后它们将分别指向数组的不同副本。

slice是克隆数组的javascript方法)

10-04 22:16