JavaScript所有参数均按值传递:原始类型传值副本,对象类型传地址副本;null是原始值,typeof返回"object"是历史bug,不影响该机制。
JavaScript 里没有“按引用传递”,所有函数参数都是按值传递——但这个“值”可能是内存地址,所以对象看起来像被引用传递了。
为什么
返回
却不影响参数传递逻辑
这是一个历史遗留 bug,和参数传递机制完全无关。它不会改变
作为原始值的行为:传入函数后,修改形参不会影响外部的
变量。真正关键的是区分“原始类型”和“对象类型”的值本质:
原始类型(
、
、
、
、
、
)的值直接存储在栈中,传递的是该值的副本
对象类型(
、
、
、
等)的值其实是堆内存中的地址,传递的是这个地址的副本
虽被误判为
,但它语义上代表“空指针”,是原始值,不指向任何对象
能生效,但
却无效
这是最常被误解的点:能否修改外部对象,取决于你操作的是“地址所指向的内容”,还是“地址本身”。
执行
:你用形参持有的地址找到了堆里的对象,并给它新增/改写属性——原对象被修改
执行
:你只是把形参变量重新赋值为一个新对象的地址,原变量仍指向旧地址,外部无感知
同理,
会改变原数组;但
不会
如何判断一次调用是否会影响外部变量
不用记规则,直接看赋值操作的左边是不是“变量本身”:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
Java免费学习笔记(深入)
”;
左边是变量名(如
)→ 不影响外部
左边是属性访问或索引(如
、
、
)→ 可能影响外部(前提是
当前不为
或
)
对原始类型,以上两种操作都无效(因为无法添加属性,
也不改变原字符串)
最容易忽略的是:函数内部对形参的重新赋值(
)永远只作用于局部变量,哪怕它原本指向一个复杂对象。别被“对象可变”带偏,重点始终在“谁在接收新值”。
typeof null"object"nullnullstringnumberbooleanundefinedsymbolbigintObjectArrayFunctionDatenull"object"obj.name = "new"obj = {}obj.name = "new"obj = {}arr.push(1)arr = [1]param = ...param.prop = ...param[0] = ...param.push(...)paramnullundefinedstr[0] = "x"=