我试图了解以下原因的工作原理:
鉴于我们有
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
被操纵,就像bar
在this.queries
中添加了_queries
一样。对于我来说,这不直观,原因为何。 最佳答案
那是因为javascript将数组视为参考。
这行代码
_queries = this.queries = queries;
将使
_queries
和this.queries
成为指向同一内存数组的指针。如果您将其更改为此:
_queries = queries.slice();
this.queries = queries.slice();
然后它们将分别指向数组的不同副本。
(
slice
是克隆数组的javascript方法)