跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何理解 JavaScript 中“按值传递”与“按引用传递”的本质差异

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]
不会 如何判断一次调用是否会影响外部变量 不用记规则,直接看赋值操作的左边是不是“变量本身”: 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载 立即学习 “ Java免费学习笔记(深入) ”; 左边是变量名(如
param = ...
)→ 不影响外部 左边是属性访问或索引(如
param.prop = ...
、
param[0] = ...
、
param.push(...)
)→ 可能影响外部(前提是
param
当前不为
null
或
undefined
) 对原始类型,以上两种操作都无效(因为无法添加属性,
str[0] = "x"
也不改变原字符串) 最容易忽略的是:函数内部对形参的重新赋值(
=
)永远只作用于局部变量,哪怕它原本指向一个复杂对象。别被“对象可变”带偏,重点始终在“谁在接收新值”。

相关文章