JavaScript所有参数均按值传递:原始类型传值副本,对象类型传地址副本;null是原始值,typeof返回"object"是历史bug,不影响该机制。

JavaScript 里没有“按引用传递”,所有函数参数都是按值传递——但这个“值”可能是内存地址,所以对象看起来像被引用传递了。
为什么 typeof null 返回 "object" 却不影响参数传递逻辑
这是一个历史遗留 bug,和参数传递机制完全无关。它不会改变 null 作为原始值的行为:传入函数后,修改形参不会影响外部的 null 变量。真正关键的是区分“原始类型”和“对象类型”的值本质:
- 原始类型(
string、number、boolean、undefined、symbol、bigint)的值直接存储在栈中,传递的是该值的副本 - 对象类型(
Object、Array、Function、Date等)的值其实是堆内存中的地址,传递的是这个地址的副本 -
null虽被误判为"object",但它语义上代表“空指针”,是原始值,不指向任何对象
obj.name = "new" 能生效,但 obj = {} 却无效
这是最常被误解的点:能否修改外部对象,取决于你操作的是“地址所指向的内容”,还是“地址本身”。
- 执行
obj.name = "new":你用形参持有的地址找到了堆里的对象,并给它新增/改写属性——原对象被修改 - 执行
obj = {}:你只是把形参变量重新赋值为一个新对象的地址,原变量仍指向旧地址,外部无感知 - 同理,
arr.push(1)会改变原数组;但arr = [1]不会
如何判断一次调用是否会影响外部变量
不用记规则,直接看赋值操作的左边是不是“变量本身”:
立即学习“Java免费学习笔记(深入)”;
- 左边是变量名(如
param = ...)→ 不影响外部 - 左边是属性访问或索引(如
param.prop = ...、param[0] = ...、param.push(...))→ 可能影响外部(前提是param当前不为null或undefined) - 对原始类型,以上两种操作都无效(因为无法添加属性,
str[0] = "x"也不改变原字符串)
最容易忽略的是:函数内部对形参的重新赋值(=)永远只作用于局部变量,哪怕它原本指向一个复杂对象。别被“对象可变”带偏,重点始终在“谁在接收新值”。


















