在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。
在开始梳理之前先说一下值类型和引用类型: 值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null ; 引用类型:对象(Object)、数组(Array)、函数(Function);
//对象赋值
let obj1 = {
name: '张三', action: {
say: 'hi'};
let obj2 = obj1;
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1)
// obj1 { name: '李四', action: { say: 'hello'}
console.log('obj2',obj2)
// obj2 { name: '李四', action: { say: 'hello'}
原数据中包含子对象,改变新对象会使原数据一同改变
//浅拷贝
let obj1 = {
name: '张三', action: {
say: 'hi'};
let obj2 = Object.assign({
}, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1)
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2)
// obj2 { name: '李四', action: { say: 'hello'}
//浅拷贝
let obj1 = {
name: '张三', action: {
say: 'hi'};
let obj2 = {
... obj1};
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1)
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2)
// obj2 { name: '李四', action: { say: 'hello'}
注:concat(),slice()也属于浅拷贝
//深拷贝
let obj1 = {
name: '张三', action: {
say: 'hi'};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1)
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2)
// obj2 { name: '李四', action: { say: 'hello'}
//深拷贝
let obj1 = {
name: '张三', action: {
say: 'hi'};
let obj2 = $.extend(true, {
}, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1)
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2)
// obj2 { name: '李四', action: { say: 'hello'}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187148.html原文链接:https://javaforall.cn