Javascript对象引用与数组中的对象有关联吗?

8

如果我有一个对象:

var array = [];
var theobject = null;

array.push({song:"The Song", artist:"The Artist"}, {song:"Another Song", artist:"Another Artist"});

我可以:

for(var i = 0; i < array.length; i++)
if(array[i].song == "The Song") {
theobject = array[i];
break;
}

如果我通过以下方式更改对象:

如果我然后通过以下方式更改对象:

theobject.song = "Changed Name";

我遇到了问题,尽管我试图仅将"theobject.song"设置为"Changed Name",但array [0] .song也被设置为“Changed Name”。
我希望的是"theobject.song"变成"Changed Name"而array [0]. song 仍然是"The Song"。
如何最好地实现这一目标?

3
为什么不试一试呢? - blockhead
2个回答

9

在循环中你永远无法得到对你的对象的引用。尝试使用以下方法:

for(var i = 0; i < array.length; i++)
 if(array[i].song === "The Song") {
 theobject = array[i];
 break;
}

那会给你一个对象的引用,你就可以更改这个对象的“歌曲”属性。
如果你想使用对象的副本,那么你就需要手动复制。例如:
function clone(obj) {
  var copy = {};
  for (var attr in obj) {
   if (obj.hasOwnProperty(attr)) {
     copy[attr] = obj[attr];
   }
  }
  return copy;
}

而你的循环变成了:

for(var i = 0; i < array.length; i++)
 if(array[i].song === "The Song") {
 theobject = clone(array[i]);
 break;
}

我不想要引用,我需要一份副本。我只想更改对象的歌曲属性,而不是原始数组。 - Rolando

1
可以使用Object.assign()仅复制其值而不是引用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

var array = [];
var theobject = null;

array.push({
  song:"The Song", 
  artist:"The Artist"
  }, 
  {
  song:"Another Song", 
  artist:"Another Artist"
});

for(var i = 0; i < array.length; i++)
  if(array[i].song == "The Song") {
    theobject = Object.assign( {}, array[i] );
    break;
  }
  
theobject.song = "Changed Name";

console.log( array );
console.log( theobject );


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接