Javascript JSON.parse(JSON.stringify(obj))如何深度克隆对象?
我在网上搜索关于深度克隆javascript obj的文章,但是大多数人说使用Javascript JSON.parse(JSON.stringify(obj))如何深度克隆对象?,javascript,Javascript,我在网上搜索关于深度克隆javascript obj的文章,但是大多数人说使用JSON.parse(JSON.stringify(obj))可以做到这一点, 不要解释为什么此方法将深度克隆obj?JSON.stringify将JavaScript对象转换为JSON文本,并将该JSON文本存储在字符串中,例如: var my_object = { key_1: "some text", key_2: true, key_3: 5, key_6: [{}] }; var object_as_str
JSON.parse(JSON.stringify(obj))
可以做到这一点,
不要解释为什么此方法将深度克隆obj?JSON.stringify将JavaScript对象转换为JSON文本,并将该JSON文本存储在字符串中,例如:
var my_object = { key_1: "some text", key_2: true, key_3: 5, key_6: [{}] };
var object_as_string = JSON.stringify(my_object);
// "{"key_1":"some text","key_2":true,"key_3":5,"key_6":[{}]}"
typeof(object_as_string);
// "string"
所以在这里,所有对象
和数组
都失去了它的引用
当我们执行JSON.parse
时,会将JSON文本字符串转换为JavaScript对象,例如:
var object_as_string_as_object = JSON.parse(object_as_string);
// {key_1: "some text", key_2: true, key_3: 5, key_6: Array(1)}
typeof(object_as_string_as_object);
// "object"
现在,生成的对象获得了新的存储引用。让我们通过检查父对象中array
的引用来测试它
my_object.key_6 === my_object.key_6
// true
但是,如果我们尝试
my_object.key_6 === object_as_string_as_object.key_6
// false
JSON.stringify
将整个对象转换为JSON
获取JSON并构造一个新对象……JSON只是一个字符串。字符串不可能包含对对象的任何引用……除了@VLAZ所说的之外,它实际上并没有克隆所有内容。它不会像JS类那样复制函数或自定义类型信息。您只能使用一些原语,如数字、布尔值、字符串、对象和数组。@此外,它还将删除所有未定义的属性,因此如果属性的值为未定义的,它将类似地消失,就像它是一个函数一样。但是null
属性很好。。。因为null
是一个对象。