Day21【Dev】物件类型:mutable 与 Immutable

mutable 与 Immutable 比较

Immutable object 不可变物件

  • 物件被创造後,其 value 无法被改变
  • 物件以传值(by value)方式被储存
  • 如 JavaScript 的原始型别 number、string、null、undefined、boolean 等

Mutable object 可变物件

  • 物件被创造後,参考固定,但参考的记忆体内容可以改变
  • 物件以传址(by reference)方式被储存
  • 如 JavaScript 的参考型别 Object、Array、Function 等
  • 如果要完全复制值而非参考,必须使用「深拷贝(deep clone / deep copy)」技术

何谓可变与不可变?

Mutable 可变的

Mutable object 属於传址型资料,
在 JavaScript 中又被称为「参考型别」,
特色是以「键/值」(key/value)方式存取内容。

这种物件的值实际是指向一个「参考」,
因此在存取 Mutable object 时,
返回的其实是一个参考位址,
参考指向的记忆体位置才是真正的值,
因此称为「传址」。

如果某个变数储存的是 Mutable object,
则当我们改变它的值时,
参考本身并没有变动,
而是参考里面指向的真正的值,
其储存位址里的内容被改变了。

对程序来说物件还是同个物件,
内容却已经不一样了,
因此被称为「可变物件」。

Immutable 不可变的

Immutable object 属於传值型的资料,
在 JavaScript 中又被称为「原始型别」。

Immutable object 本身
就是一个无法变动的纯粹的值,
如果变数内储存的是 Immutable object,
当变数重新赋值时,
原本的 Immutable object 会直接被废弃,
用新的值去取代它。

原本的值和後来的值是完全独立的关系,
Immutable object 只会产生和消失,
不会发生改变,因此称为「不可变物件」

let stringA = "This is a string";
let stringB = stringA;
stringA = "The string has changed";

console.log(stringA); //The string has changed
console.log(stringB); //This is a string
console.log(stringA === stringB); //false

简单来说,想要改动 Immutable 物件时,
同个记忆体位置的旧值会被新值取代;
而改变 Mutable 物件时,
记忆体还是一样的「参考」,
而参考指向的值内容其实已经不一样了。


为什麽需要 Immutable?

Immutable 在建立实体之後无法改变,
因此内容是单纯、可预期的,
不会发生对相同的资料进行操作
而造成非预期的行为。

JavaScript 的参考型别则就属於 Mutable,
在操作时某个变数的内容
常常会非预期地被改变了却没有察觉。

Immutable objects 在读取和储存时也更有效率,
但在改变 values 时因为是重新创造一个 object,
代价则会相较 mutable objects 要来得多。


参考资料


<<:  Day 25 - 云端备份是降低专案风险的一环

>>:  【设计+切版30天实作】|Day23 - Pros区块 - 看似无边框的三栏式卡片,到底要对准哪条栏位?

[DAY 12]让BOT 24小时在线(3/3)

今天分享程序码从github更新到replit的步骤还有要注意的点 步骤 replit有自带储存环境...

Day27【CSS】伪类 & 伪元素

伪类和伪元素皆是从 DOM tree 抽象出来的概念, 用以修饰实际上不在 DOM tree 上的部...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day19 巢状路由

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

Day 31 - 迟来的铁人赛心得

某人可能会迟到,但从不缺席 (没x 失踪很久了好吗== 故事原点 在正式参加铁人赛之前,我从不知道...

[Day 27] JS实作练习 - Music Player

前言 接下来几天将以JS实作练习为主,提供制作方式的笔记,透过拆分各个项目的说明,能够了解如何实现每...