[Day16] 传值、传址 or call by sharing

传值或传址?

前面两篇所讲的,基本型别是传值,物件型别是传址,但同时也存在例外,举下例,如果对 obj 赋予一个新的物件,那外面的变数会被改变吗?

var coin1 = { value: 10 };

function changValue(obj) {
  obj = { value: 200 };
}

changValue(coin1);
console.log(coin1); // { value: 10 } 一样,没有被改变

而如果不是重新赋值的状况,而是修改属性:

var coin1 = { value: 10 };

function changValue(obj) {
  obj.value = 200
}

changValue(coin1);
console.log(coin1); // { value: 200} 外面 coin1 的值被改变了

自己的结论

因为写了这个主题才发现,前面讲的传值 call by value、传址 call by reference,还有另外一种很多人偏向的 call by sharing(未有合适翻译),原来这是连 ECMAScript 都没有定义的概念,於是大家都是用其他程序语言的定义来推测 JavaScript 是属於哪一种形式。

因为无法证明 JavaScript 记忆体的运作方式,以及在不同执行引擎下会有不同结果,所以相关概念在未经证实的情况都仅能参考,而我觉得试着画记忆体图、流程图的部分,能帮助自己在实作上的理解。

参考资料

JavaScript’s Memory Model
008天重新认识JavaScript
Call by Reference 还是 Call by Sharing


<<:  认识CSS(六):CSS border边框

>>:  JavaScript入门 Day26_while回圈

CSS微动画 - 不知道要吃什麽?Slot帮你选吧

Q: 网路上已经很多可以用的随机选择器了耶... A: 拉霸的用途很多,看你怎麽用罗~ 已经连续N...

30天学会 Python: Day 1-印啦!哪次不印!

型别 型别指的是资料的型态,Python 内建的几个基本型态有: 数字 整数(Integer)-in...

Docker Debug 挑战题 - 网页跑板了!? 小容器 我要进来罗

这边为一道设计过的 Docker Debug 挑战题目,初始环境有所设置错误,请大家帮忙找出 Do...

【Day18】浏览器物件模型--BOM

我们学习前端语言就是为了跟浏览器沟通,让网页可以渲染出想要的效果,创造使用者互动的良好体验。所以要...

Day25 - 保护你的状态转移,在 XState 中使用 Guard Transition

还记得我们在 Day 15 曾经介绍过 Guard 吗? 今天要来跟大家分享如何在 XState 中...