You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript链表遍历:修改函数参数引用为何不影响原对象?

JavaScript 参数传递:为什么修改函数内的参数引用不会影响外部变量?

你这个问题戳中了很多JavaScript开发者容易混淆的点——JavaScript确实是按值传递的,但对于对象类型来说,这个“值”是对象引用的副本,这就是为什么你看到的结果和预期不一样。

咱们用你的场景具体拆解:
假设你有这样的链表和遍历函数:

// 你的链表对象
const list = { val: 1, next: { val: 2, next: null } };

function traverse(node) {
  // 你修改参数引用的位置
  node = null; 
}

traverse(list);
console.log(list); // 输出原链表对象,不是null

背后的原理是这样的:

  • 当你调用traverse(list)时,函数的参数node会被赋值为list变量中存储的引用的副本——注意,是副本,不是原引用本身。
  • 这时候list和node是两个独立的变量,但它们暂时指向同一个链表对象。
  • 当你在函数里执行node = null,你只是把node这个局部变量的指向改成了null,完全没有改动list变量里的原引用,所以外部的list依然指向原来的链表对象。

那如果想影响外部对象该怎么做?

如果你要修改的是对象本身的内容,而不是参数的引用指向,那外部是会看到变化的。比如:

function updateList(node) {
  node.val = 'updated';
}

updateList(list);
console.log(list.val); // 输出 'updated'

这是因为node(引用副本)和list(原引用)指向同一个对象,修改对象的属性会直接作用在这个共享的对象上,所以外部能看到变化。

一句话总结:

JavaScript里所有参数都是按值传递的。对于基本类型,传递的是值的副本;对于对象类型,传递的是对象引用的副本——修改这个副本的指向不会影响原引用,但修改副本指向的对象内容,会影响原引用指向的对象。

内容的提问来源于stack exchange,提问作者Abhishek Mehandiratta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:22:36