2016-01-15 121 views
-3

我正在制作一个小例子来显示JSON(键和值)。当我将JSON复制到另一个变量时,我尝试删除键Age并重新显示第一个JSON。第一个JSON中的键Age也被删除了。将对象复制到JavaScript中的另一个对象

$('button').click(function() { 
 
    var json = {}; 
 
    json['Name'] = 'Hermione'; 
 
    json['Age'] = 19; 
 
    
 
    for (i in json) { 
 
    $('body').append($('<p>').text(i + ': ' + json[i])) 
 
    } 
 
    
 
    var copy = json; 
 
    delete copy['Age']; 
 
    
 
    for (i in json) { 
 
    $('body').append($('<p>').text(i + ': ' + json[i])) 
 
    } 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button>Click me</button>

所以,我的问题是:复制对象到另一个对象意味着什么在JavaScript中,对不对?

我认为,因为当我复制它时,它仍然在主版本(json)上运行,而不是在复制版本上(copy)。

+0

当你复制= JSON你不是抄袭的对象。你只是为同一个对象创建另一个引用。 – banzomaikaka

+0

为什么您将对象称为“JSON”,这是一种基于字符串的格式,用于在服务器和客户端之间交换信息? –

回答

1

var copy = json;将创建json对象的引用。

Javascript对象是mutable,这意味着如果您从一个对象中删除属性,则引用该对象的另一个对象也将丢失该对象。

如果你不希望发生这种情况,那么寻找将创建新的独立对象的JavaScript对象的deep copy

+0

这与可变性无关。 –

+0

@torazaburo先生,我的意思是_mutable_彼此独立。这不正确吗? – Rayon

1

那是因为您只是将相同的对象分配给另一个变量。 如果你真的想复制对象,你可以使用jQuery的扩展功能。

// Shallow copy 
var copy = jQuery.extend({}, json); 

// Deep copy 
var copy= jQuery.extend(true, {}, json); 

有关“克隆”js对象的更多信息,请参阅此thread

1

您的var copy = json是对json的引用,而不是json的副本。它只是一个指向内存中相同位置的指针。 所以每当你说delete copy["Age"],你指的json["Age"]

+0

我认为你的意思是“一个指向**内存中相同**位置的指针”。 –

+0

这确实是我的意思,对于混乱感到抱歉。我现在改了它。 – Thomas

1

你不能简单对象复制到另一个变量一样var copy = json;因为对象是通过引用赋值。

尝试,

var copy = JSON.parse(JSON.stringify(json)); 
+0

在深入克隆物体的众多方式中,这绝对是一种,但决不是最好的一种。看到相关的问题。 –

1

VAR副本= json的;只需创建一个名为“copy”(一个指针)的新变量,该变量指向对象“json”。你还没有“复制”任何东西。你只是说我要给JSON另一个名字,名字是“复制”。如果你想递归克隆一个对象,你需要编写一个函数来实现它,或者使用下划线/ lodash的_.cloneDeep()

var objects = [{ 'a': 1 }, { 'b': 2 }]; 

var deep = _.cloneDeep(objects); 
console.log(deep[0] === objects[0]); 
// → false 
-1

其工作

<html> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
    <script> 
     function myFunction() { 
      var json = {}; 
      json['Name'] = 'Hermione'; 
      json['Age'] = 19; 
      for (i in json) { 
       $('body').append($('<p>').text(i + ': ' + json[i])) 
      } 
      var copy = json; 
      delete copy['Age']; 
      for (i in json) { 
       $('body').append($('<p>').text(i + ': ' + json[i])) 
      } 
     } 
    </script> 
</head> 
<body> 
    <input type="button" class="button" onclick="myFunction()" value="Click me"> 
</body> 

+0

什么是工作,如何? –

相关问题