Vue.js 从零开始:物件参考 深拷贝 浅拷贝

资料处理是JavaScript非常重要的一环,如果观念不正确,常常会卡在那边,就算可以运行了,也不知道原理是什麽,本篇就来复习一下观念。


资料处理中有一项叫做物件参考特性,是很多新手常会碰到的问题点,特性为物件是以传参考的形式赋值,请看下面范例:

const obj = {
  name: '老王',
  data: {}
}
const obj2 = obj;
obj2.name = '小黄';

console.log(obj.name,obj2.name)

结果为 obj.name 为小黄,obj2.name 也是小黄,原本的name也被改变了,来画张图说明会什麽会这样。
https://ithelp.ithome.com.tw/upload/images/20210919/20118347PbWSTZmelx.png

01指的是obj的物件,里面有name和data属性,注意data是一个物件,所以另外只指向到02,obj2也是指向第一个框框,所以obj2.name会一直改变obj.name,就算另外再新增新变数,结果也是一样。

再来把 a 物件丢到函式当参数看结果会不会一样呢:
https://ithelp.ithome.com.tw/upload/images/20210919/20118347X9PjKBKlYQ.png
console.log 结果是 true,就算丢到函式里面还是有传参考的特性在。

再来一个陷阱题范例:

var a = {
  name: 'a',
}

function Data(param) {
  return {
    name: param.name
  }
}

var b = Data(a);

console.log(a === b);

请问console.log的结果会是一样true吗?





正确答案是false,画张图来说明:
https://ithelp.ithome.com.tw/upload/images/20210919/201183473Dga32w1py.png
Data(a)将参数a传到函式Data(param)里,这时return回传了一个新物件,新物件里面的值是复制原本a物件里面的值,所以结果就会是false,关键在於这个新物件,增加一个新物件就代表不会延续旧物件的值了,为了解决这种传参考的问题,有以下两种方法:

  1. 浅层拷贝
const person = {
  name: '小王',
  obj:{},
}

const person2 = Object.assign({}, person);
const person3 = { ...person };
console.log(person === person2,person ===person3);
person2.obj.age = 16;

console.log(person,person2)

https://ithelp.ithome.com.tw/upload/images/20210920/20118347oH2NeWTQE2.png
person2.obj.age = 16,person里面的obj被改变,当更深层的物件被改变时,浅拷贝就会失效,这时就要使用到深拷贝

2.深层拷贝

var a = {
  name: 'a',
}
function data(param){
  const newData = JSON.parse(JSON.stringify(param));
  return newData;
}
var b = data(a);

console.log(a === b);

JSON.stringfy 把Param物件转字串,JSON.parse再转回物件JSON格式,来消除参考位置。


/images/emoticon/emoticon13.gif


<<:  Day 7:Prometheus

>>:  Day 7 从阅读错误到通过测试!

理解 HTTP(一):网站内容是怎麽被下载到电脑里的?

你是否曾经好奇浏览网页时,输入的网址为什麽都是 http 开头的? 从网路模型 TCP/IP 聊起,...

IT铁人DAY 21-Facade 外观模式

  今天要介绍的模式是属於结构型模式的一种,我个人觉得他还蛮简单的,有点像是程序码中的主要窗口,现在...

Day6-我通知你的通知通知我!!!(无误!

标题那个还真的是没有写错~ 且听我细细道来~ ------------------------ 【一...

Day 7 [Python ML] Machine Learning的处理流程

Step 1: 蒐集数据 要先将自己需要的数据下载好,并且确认资料格式而去做不同的处理 Step ...

[Day 17] 资料产品生命周期管理-辅助决策

如同前面所说,资料模型需要运用到实际环境中才会发挥价值 Initiation 延续之前模型的初始条件...