Day03-搞懂传址、传值? 电脑如何储存资料?

前言

昨日我们学习了资料的型态,今天我们要来了解变数的参考。

Pass by Value ?

  • String
  • Number
  • null

我们先建立一个a变数,并且把b指向a

var a = 3
var b = a


console.log(a,b); // 3 3

没错跟我们所想的一样

但如果我们把变数a 改掉呢???

var a = 3
var b = a
a = a + 1

console.log(a,b); //4 3

是不是跟你所想的不太一样???

为什麽我明明是指向a,但改变变数a,变数b却没有影响

「这是因为在JavaScript中, String、Number、Null是使用浅复制,也就是 = 只是复制资料给其宣告变数。」

嗯 ? 是这样吗

var a = 3
var b = a

a = a + 1
console.log(a,b); //4 3
var a = null
var b = a
a = 1
console.log(a); //1
console.log(b); //null


Pass by Reference

  • Array
  • Object
  • Function

在上面我们介绍了by value的型态,接下来我们来了解by reference的行为。

在这边先插播一下,在我们这个世界里会针对各种现象去做不同名词的解释。

而我们要了解程序运作原理,就要知道电脑如何把资料储存在记忆体中。

Object

物件的传址方式,也就是a和b共同指向同一个记忆体!!!

var a = {name: 'Dennis'}
var b = a
console.log(a,b); //{ name: 'Dennis' } { name: 'Dennis' }

a.name = 'Ian'

console.log(a,b);//{ name: 'Ian' } { name: 'Ian' }

Array

var a = [1,2]
var b = a
console.log(a,b);//[ 1, 2 ] [ 1, 2 ]
a = [1,2,3]
console.log(a,b); //[ 1, 2, 3 ] [ 1, 2 ]

不是说Array是Pass by Reference吗???

我们说的pass by reference是说指向记忆体,并不是指向a的变数,而是指向a所指向的记忆体位址!!!

以下图来说

https://ithelp.ithome.com.tw/upload/images/20210902/20130419SRhEaMY1zz.png

比如阵列[1,2]在电脑中的位址为100号,而我宣告变数a会指向100号,再宣告b把a指向的记忆体位址交给b,所以a和b都指向100号。

但中途又把a指向[1,2,3]也就是101号的位址,那当然a和b会得到不同的资料瞜!!!

因为b并不是指向a,而是取得a指向的位址!!!

以下面的程序来说就符合共同指向

var a = [1,2] 
b = a 

a.push(3)
console.log(a,b); //[ 1, 2, 3 ] [ 1, 2, 3 ]

假设阵列[1,2]为100号,我在100号新增了一个数值那还是在100号,所以a和b共同获得同一位址,当然指向100号!!!

https://ithelp.ithome.com.tw/upload/images/20210902/201304190xGm1QimBg.png

Function

使用一级函式可能跟你想的不太一样

var a = function test() {
  console.log('hi');
}

var b = a

a = function test() {
  console.log('hello');
}

a() //hello
b() //hi

如果用我们上面所述的指标与记忆体位址来看待,就会很好了解。

以下程序代表电脑会为资料创造一个空间,就算都是一样的资料、名称,也会是不同记忆体位址。

var a = function test() {
  console.log('hello');
}

var b = function test() {
  console.log('hello');
}
console.log(a === b); //false
var a = function test() {
  console.log('hello');
}

var b = a
a() // hello
b() //hello

function test() {
  console.log('hi');
}
a = test
a() //hi
b() //hello


总结

我相信很多人都会被pass by reference 或是 pass by value搞混。

这边提供给各位一个观念,只要记得电脑储存资料都会使用记忆体位置,当资料不同的时候想必会有不同的位址。

就像每间房子里面住不同的人,你要找阿明、阿华都是不同的家、不同的门牌号码。

照着这个脉络其实我们就可以很明确的知道其实一切都是指标与记忆体。

而阵列、物件、函式里面的资料,都像是房子里面的所属物,而房子门牌一样不会变。

所以把 = 看作指向某个位址这样会更好的贴近电脑的操作,而我们也不会被各种看起来很多专有名词解释的现象搞混!!!

当然我也是绞尽脑汁才敢大胆做结语,如果有更好的解释可以在下面留言,我会再做修改。


<<:  DAY3-排序(二)

>>:  画一个三角形(下)

K8s - Kubernetes 指令参考笔记

K8s - Kubernetes 指令参考笔记 参考资料 参考资料1:Day 11 Kubernet...

虚拟机器监视器(Hypervisor)

-虚拟机和容器部署(来源:NIST SP 800-190) 虚拟机器监视器(Hypervisor)...

Day 17 网页分析 - Web Application Analysis (WhatWeb)

WhatWeb是一个用来分析网站的工具,拥有超过1800种的插件来分析网站,包括服务器类型、版本、I...

Day 3. 关於.NET後端技术

我在接触写程序後没多久(大约半年)就开始接触後端,一开始什麽都看不懂,当时公司里的前辈虽然愿意回答问...

资讯治理(Data Governance)

数据管理员(Data Steward) 数据管理员是组织中的一个角色,负责利用组织的数据治理流程来...