JavaScript链表指针操作疑问:为何headA/headB未随指针变更
JavaScript赋值机制与链表节点问题解析
一、基本类型与引用类型的赋值差异
基本类型(数字、字符串、布尔等)
赋值时直接复制值本身,两个变量各自持有独立的副本,修改其中一个不会影响另一个。比如你给出的示例:
var a = 10; b = a ; console.log(a,b); // 输出 10 10 // 如果后续修改 b = 20,a 还是 10,互不干扰
引用类型(对象、数组、链表节点等)
赋值时复制的是内存地址(引用),两个变量指向内存中同一个对象:
- 如果修改的是对象的属性,会直接改动共享的那个对象,所以原变量也会看到变化,比如你的示例:
var a = { "name" :"A" } b = a; b.name = "C"; console.log(a,b); // 输出 {name: "C"} {name: "C"} - 但如果是直接给变量重新赋值(比如
b = {name: "D"}),只是改变了变量b的引用指向,和原变量a的引用无关,a仍然指向原来的对象。
二、链表函数中headA/headB不变的原因
在getIntersectionNode函数里:
var getIntersectionNode = function(headA, headB) { let a = headA, b = headB; while (a !== b) { a = !a ? headB : a.next b = !b ? headA : b.next } return a };
- 初始时
a = headA、b = headB只是让a、b拿到了headA、headB的引用,但后续的a = a.next或a = headB是给变量a重新赋值,只是改变了a的引用指向,并没有修改headA本身的指向,也没有修改headA指向的节点的属性。 - 简单说:headA是一个指向头节点的指针,a是另一个指针,一开始和headA指向同一个节点,但后来a转而去指其他节点,完全不会影响headA的指向,所以headA和headB自始至终都保持最初的状态。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

