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
相关产品推荐
相关产品推荐

