[Day22] 传值跟传参考概念

JavaScript 的型别有两种 - 纯值与物件,而在 JavaScript 中,赋予一个值到变数上时会有两个特性 - 传值与传参考,纯值是透过传值的方式来做传递,而物件则是透过传参考,以下是关於传值与传参考的说明:

传值 (call by value)

传值是一种复制的概念,而 纯值是透过传值的方式来做传递,当一个变数被赋予至另一个变数上,在赋予值之後,两个变数就没有关系了

以下范例是使用字串(纯值)来做传递

  • 宣告 变数 person 後,记忆体会存放 变数 person 的名称与值
  • 宣告 变数 person2 并将 变数 perosn 赋予至 变数 person2 上,变数 person2 会直接接收 变数 perosn 的值 -> 此种方式就是传值
  • 就算更改 变数 person2 的值,变数 person 的值也不会改变
var person = 'Carol';
var person2 = person;
person2 = 'Mary';

console.log(person); // Carol
console.log(person2); // Mary

运作过程

纯值有:

  • Number 数字型别
  • String 字串型别
  • Boolean 布林值
  • Null 空
  • Undefined 未定义
  • BigInt 整数数值
  • Symbol

传参考 (call by reference)

物件型别(ex: 物件、阵列、函式)都属於传参考

范例1

此范例中当更改了 变数 person2 的值,变数 person 同样也会被更改到,因他们指向相同物件。使用严格相等也可看到 变数 person变数 person2 是指向同个记忆体参考路径

  • 设定 变数 person 并赋予一个物件型别的值,这个物件会存放在记忆体中,而 变数 person 则会指向此物件的 记忆体参考路径
  • 当将 变数 person 赋予至 变数 person2变数 person2 也会指向同一个 记忆体参考路径
  • 所以当我们修改 变数 person2 的物件时,因与 变数 person 是指向相同物件,所以 变数 person 也同样会被更改到
var person = {
    name: 'Carol',
    money: 200
};
var person2 = person;
person2.nickName = 'Jay';

console.log(person); // {name: 'Jay', money: 200}
console.log(person2); // {name: 'Jay', money: 200}
console.log(person === person2); // true

范例1 运作过程

范例2

当变数重新赋予新的物件时,表示指向新物件的 记忆体参考路径

此范例中当将 变数 person2 重新赋予一个新的物件,变数 person2 会指向新物件,所以就算修改 变数 person2 也不会影响 变数 person。使用严格相等也可看到 变数 person变数 person2 是指向不同个记忆体参考路径

  • 赋予 变数 person 一个物件型别的值,此物件会存放在记忆体中,而 变数 person 会指向此物件的 记忆体参考路径
  • 当将 变数 person 赋予至 变数 person2变数 person2 会与 变数 person 指向同一个 记忆体参考路径
  • 当我们重新赋予 变数 person2 一个物件型别的值,变数 person2 会指向新物件的记忆体参考路径
  • 所以当修改 变数 person2 的物件时,因与 变数 person 已指向不同的 记忆体参考路径,故 变数 person 不会被更改到
var person = {
    name: 'Carol',
    money: 200
};
var person2 = person;
person2 = { name: 'Jay' };
person2.name = 'Mary';

console.log(person); // {name: 'Carol', money: 200}
console.log(person2); // {name: 'Mary'}
console.log(person === person2); // false

范例2 运作过程

参考文献

六角学院 - JavaScript 核心篇

心得: 画图真的很花时间 ><


<<:  Day25 - 使用Django-Q排程

>>:  Day 22 ATT&CK for ICS - Discovery(2)

第12天 - 用 PHP Session 与 Bootstrap 做警告(提示)

今天用来使用 Session 做警告(提示),它可以用来让使用者知道他的动作使否有成功(例如修改成功...

Day21-部署篇(三)Laravel 专案部署与 MySQL、Nginx 设定

大家好~ 继续昨天的主题, 今天要来把 Laravel 部署上 Server, 顺便设定一下 MyS...

DAY1 起手式--建置 Nuxt.js 环境

Nuxt.js是什麽?可以吃吗? 每一个工具的诞生,都是为了"解决问题",而 Nuxt.js 是用来...

DAY20-EXCEL统计分析:单因子变异数分析实例

今天有一家饮料店想比较不同县市的分店销售量,想确认不同县市每天的销售量是否有明显的差异,於是随机抽选...

Youtube Data API 教学 - 抓取你的金钥 API key

「鲑鱼均,因为一场鲑鱼之乱被主管称为鲑鱼世代,广义来说以年龄和脸蛋分类的话这应该算是一种 KNN 的...