Javascript 未更新时,this.head如何直接更新?

Javascript 未更新时,this.head如何直接更新?,javascript,data-structures,Javascript,Data Structures,我的LinkedList类有两个属性 这是我的头 这个尺寸 this.head用于包含对象列表。简单的逻辑是,如果我更新this.head,它的值应该被更新。但是,如果我将其值赋给其他变量,然后尝试更新该变量,则原始this.head不应更新 例如: 但这段代码与这种情况相矛盾。我不知道为什么this.head在没有直接引用的情况下在这里得到更新 insertAt(data, index){ if(index > 0 && index > this.size

我的LinkedList类有两个属性

  • 这是我的头
  • 这个尺寸
  • this.head
    用于包含对象列表。简单的逻辑是,如果我更新
    this.head
    ,它的值应该被更新。但是,如果我将其值赋给其他变量,然后尝试更新该变量,则原始this.head不应更新

    例如:

    但这段代码与这种情况相矛盾。我不知道为什么
    this.head
    在没有直接引用的情况下在这里得到更新

    insertAt(data, index){
    
        if(index > 0 && index > this.size)
          return 
        
        const node = new Node(data);
        let current, previous;
    
        current = this.head;
        let count = 0;
    
        while(count < index){
          previous = current;
          count++;
          current = current.next;
        }
    
        node.next = current;
        previous.next = node;
    
      };
    
    insertAt(数据、索引){
    如果(索引>0&&index>此.size)
    返回
    const node=新节点(数据);
    让现在,过去;
    电流=这个头;
    让计数=0;
    while(计数<索引){
    先前=当前;
    计数++;
    当前=当前。下一步;
    }
    node.next=当前;
    previous.next=节点;
    };
    
    整段代码

    class Node{
      constructor(data, next = null){
        this.data = data;
        this.next = next;
      }
    }
    
    class LinkedList{
      constructor(){
        this.head = null;
        this.size = 0;
      };
        
      insert(data){
        this.head = new Node(data, this.head);
        this.size++;
      };
    
      insertAt(data, index){
    
        if(index > 0 && index > this.size)
          return    
    
        const node = new Node(data);
        let current, previous;
    
        current = this.head;
        let count = 0;
    
        while(count < index){
          previous = current;
          count++;
          current = current.next;
        }
    
        node.next = current;
        previous.next = node;
    
      };
    
      printElements(){
        let current = this.head;
        while(current){
          console.log(current.data)
          current = current.next;
        }
      };
    
    }
    
    类节点{
    构造函数(数据,next=null){
    这个数据=数据;
    this.next=next;
    }
    }
    类链接列表{
    构造函数(){
    this.head=null;
    此值为0.size=0;
    };
    插入(数据){
    this.head=新节点(数据,this.head);
    这个.size++;
    };
    插入(数据、索引){
    如果(索引>0&&index>此.size)
    返回
    const node=新节点(数据);
    让现在,过去;
    电流=这个头;
    让计数=0;
    while(计数<索引){
    先前=当前;
    计数++;
    当前=当前。下一步;
    }
    node.next=当前;
    previous.next=节点;
    };
    printElements(){
    让电流=这个头;
    while(当前){
    console.log(当前的.data)
    当前=当前。下一步;
    }
    };
    }
    
    让我们尝试一下显示您所询问的行为的最少示例,使其主要与语言无关,因为这不是特定于JS的


    为什么这个片段不打印
    20
    ?而是打印
    10

    b = new Node(20);
    a = new Node(10, b);
    c = a;
    c = c.next;
    console.log(a.data);
    
    b = new Node(10);
    a = b;
    a.data = 20;
    console.log(b.data);
    

    为什么此代码段不打印
    10
    ?而是打印
    20

    b = new Node(20);
    a = new Node(10, b);
    c = a;
    c = c.next;
    console.log(a.data);
    
    b = new Node(10);
    a = b;
    a.data = 20;
    console.log(b.data);
    

    这两个问题都是由于变量和对象相互混淆而产生的。这两个概念相互关联,但又截然不同

    当我们说像
    b=newnode(20),我们正在声明一个变量
    b
    实例化一个对象
    节点(20)
    ,并引用变量中的对象
    b
    保存对
    节点(20)
    的引用。如果我们说
    b.data=30
    ,现在
    b
    保存对
    节点(30)
    的引用。这是与以前相同的节点,但其数据已更改。到目前为止,对象/变量的区别还没有显现出来

    我们也可以说
    a=b,如第二个示例所示。这意味着我们有两个变量都引用相同的
    节点(20)
    对象。如果我们说a.data=30
    ,则变量
    a
    的数据引用的对象被设置为
    30
    。因此,由于只有一个节点对象,
    b.data
    a.data
    都是
    30


    当我们说像
    c=a;c=c.next
    ,由
    a
    引用的节点仍然存在,仍然由
    a
    引用
    a
    像一个箭头,指向
    节点(10)
    c
    是另一个箭头,也指向
    节点(10)
    <代码>c=c,下一步
    a
    没有影响。它只是改变了
    c
    所指的内容。

    请详细说明您认为问题所在。具体来说,哪些行、它们在做什么以及您认为它们应该做什么。在insertAt函数中,当我们更新
    节点.next
    previous.next
    时,它直接影响
    this.head
    ,而不显式更新
    this.head
    。当涉及printElements()函数时,这种行为是不一致的。您是否尝试过使用调试器单步检查代码以查看发生了什么?为什么您认为更新头部的
    next
    指针是个问题?否则,您将如何在头之后立即插入节点?不,这正是通过更新下一个指针插入节点的方式。我对javascript如何更新属性感到困惑,因为当我们打印列表时,它不会在printElements中更新属性。我真的很难理解您提出的问题。你想知道当
    previous=head
    我们说
    previous.next=node
    时,
    head
    是如何更新的吗?