我正在做一个小例子来显示JSON(键和值)。当我将JSON复制到另一个变量时,我试图删除键Age
并重新显示第一个JSON。第一个JSON中的键Age
也已被删除。
$('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 :(得分:1)
var copy = json;
将创建json
对象的引用。
Javascript对象为
mutable
,这意味着如果从一个对象中删除属性,则引用该对象的另一个对象也将丢失该密钥。
如果您不希望这种情况发生,那么请查找将创建新独立对象的deep copy
个javascript对象。
答案 1 :(得分:1)
答案 2 :(得分:1)
您的var copy = json
是对json
的引用,而不是json
的副本。
它只是指向内存中相同位置的指针。
因此,只要您说delete copy["Age"]
,就会引用json["Age"]
答案 3 :(得分:1)
你不能简单地将对象复制到另一个变量,如var copy = json;
,因为对象是通过引用分配的。
试,
var copy = JSON.parse(JSON.stringify(json));
答案 4 :(得分:1)
var copy = json;只需创建一个名为&#34; copy&#34;的新变量。 (指针),指向对象&#34; json&#34;。你没有复制&#34;任何东西。你只是说我要给json另一个名字,名字是&#34; copy&#34;。如果要递归克隆对象,则需要编写一个函数来执行它或使用下划线/ lodash&#39; s _.cloneDeep()。
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// → false
答案 5 :(得分:-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>