Day 17 - Primitive and Reference

Primitive Data Types

变数拥有值,当某个变数的值赋予给其他变数时,是采用复制的方法,所以就算之後改变了值,也互不影响。
Primitive Data Types 不是物件,没有自己的 properties 和 methods ,且她们的变数拥有自己的值(value),而不是在记忆体中的参考(Reference)。
例如:

let number1 = 100;
let number2 = number1;
console.log(number1,number2); // 100,100
number1 = 50;
console.log(number1,number2); // 50,100

因为数字是 Primitive Data Type ,将 number1 这个变数丢进 number2 的时候,就变成 number2 的值,而之後如果 number1 改变值,也不会影响到 Number2 。

Reference Data Types

没有值在资料里面,只是指向 object 在电脑的记忆体位置而已
物件和阵列都是 Reference data type ,他们的变数没有自己的 value ,而是在电脑的记忆体位置里面给 value 一个参考(Reference)。
例如:

let friends1 = ["Mike","Bob","Harry"];
let friends2 = friends1;
console.log(friends2); // ["Mike","Bob","Harry"]
friends1.push("Tom");
console.log(friends1); // ["Mike","Bob","Harry","Tom"]
console.log(friends2); ["Mike","Bob","Harry","Tom"]

电脑把 friends1 的 array 放在某个记忆体位置,把 friends1 的值丢进 friends2 的时候, friends2 也装着 friends1 的记忆体位置,所以当 friends1 的东西改变时,会从 friends1 的地址去改变内容, friends2 也就从 friends1 的位置得到改变後的内容,所以最终 friends1 和 friends2 的资料室一模一样的,而不论是 friends1 或是 friends2 这个变数,他们都只是记忆体位置的参考而已。


补充:

Primitive Coercion

前面说过 Primitive Data Types 没有自己的 properties 和 methods ,这边我们就来探讨为什麽像是 string 还有自己的 properties (ex: length)和 methods (ex: toLowerCase()) 呢?

是因为在 JavaScript 里有一种 property 叫 Coercion ,他会强迫把 Primitive Data Type 改成一个 object 来使用 property 和 method,达成目的後又马上变回原本的状态,这种做法是对记忆体比较有效率的做法。
例如:

let name = "Justin";
console.log(name.toLowerCase()); // justin
console.log(typeof name); // string

name 在执行 toLowerCase() 的瞬间会被改成 object ,执行完後又瞬间变回 string 。

虽然可以使用 object 的语法来制作一个 string ,但这种做法还要再额外分配记忆体给这个 string ,所以不推荐这种做法,如下

let name = new String("Justin");
console.log(name); // String{"Justin"}
console.log(typeof name); // object

用这种做法变成 object 後,就会有非常多种 properties 和 methods ,对电脑的记忆体产生其他负担。

使用 Coercion 的话,因为执行完会马上恢复 primitive Data Type,这种做法还是最好的。


<<:  Day 6【React】阿嬷你怎麽没感觉?

>>:  IT 铁人赛 k8s 入门30天 -- day4 k8s 架构:Control Plane Components

Node.js 最佳实践

概述 提供在Node.js中开发更安全程序码的一般最佳实践。 建议 始终验证外部输入 通常软件中最危...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day27. Vue3 ref & reactive 小练习

说了那麽多,感觉还是有点模糊~ 没关系,我可能也差不多 ( 哈哈 所以还是透过实作练习,让自己更了解...

【从零开始的Swift开发心路历程-Day7】简易调色盘Part3(完)

昨天我们做到ImageView及TextField会根据Slider的左右滑动而改变颜色及数值,但是...

新手学习JavaScript:day28 - Todolist(1)

Todolist 是JavaScript入门中的基础实作,能够练习基础的DOM操作。身为一个初学者就...

Day22:[排序演算法]Merge sort - 合并排序法

Merge Sort采用分治法(Divide and Conquer)的方式来处理排序的问题,简单...