Javascript 引用类型脚本调用混乱

Javascript 引用类型脚本调用混乱,javascript,typescript,variable-assignment,pass-by-reference,call-by-value,Javascript,Typescript,Variable Assignment,Pass By Reference,Call By Value,各位 在熟悉TypeScript的同时,我遇到了让一个简单的LinkedList实现正常工作的严重问题 下面是源代码——我将在下面详细描述这个问题 class LinkedList<ListType> { firstElement:ListItem<ListType> = null; /** * add Element in Front of List */ addElementFirst(element: Lis

各位

在熟悉TypeScript的同时,我遇到了让一个简单的LinkedList实现正常工作的严重问题

下面是源代码——我将在下面详细描述这个问题

class LinkedList<ListType> {

     firstElement:ListItem<ListType> = null;

     /**
      * add Element in Front of List
      */
     addElementFirst(element: ListType) {
         var newItem:ListItem<ListType> = new ListItem<ListType>();

         newItem.setElement(element);
         newItem.setNextItem(this.firstElement);

         this.firstElement = newItem;
     }

    /**
     * add Element at End of List;
     */
    addElementLast(element: ListType) {

         var newItem:ListItem<ListType> = new ListItem<ListType>();
         newItem.setNextItem(null);
         newItem.setElement(element);

         //find last Element;
         var li:ListItem<ListType> = this.firstElement; //THIS IS
         while (li!=null) li=li.getNextItem(); //WHERE IT
         li = newItem; //BREAKS!
    }


    dumpListContents() {

         var li:ListItem<ListType> = this.firstElement;
        var i:number = 0; 
        while (li!=null) {
            console.log(i+". "+li.getElement());
            li=li.getNextItem(); 
            i++
        }

    }


}

class ListItem<ListType> {
    private element:ListType;
    private nextItem: ListItem<ListType>;

    setElement(element:ListType) {

        this.element=element;

    }

    getElement():ListType {

        return this.element;

    }


    setNextItem(nextItem:ListItem<ListType>) {

        this.nextItem=nextItem;


    }

    getNextItem():ListItem<ListType> {

        return this.nextItem;    

    }

}


var foo:LinkedList<string> = new LinkedList<string>();
var bar:LinkedList<string> = new LinkedList<string>();

console.log("Playing with foo");
foo.addElementFirst("first");
foo.addElementFirst("second");
foo.addElementFirst("third");

foo.dumpListContents();

console.log("Playing with bar");
bar.addElementLast("first");
bar.addElementLast("second");
bar.addElementLast("third");

bar.dumpListContents();
从理论上讲,我担心我认为赋值语义与Java有很大的不同,Java使用模拟代码,因为所有赋值都只使用引用

有没有一个简单的概念方法来解决这个问题?我可以强制底层JavaScript严格使用引用吗

致以最良好的祝愿,
Elias

您所做的只是将
newItem
赋值给局部变量
li

//find last Element;
var li:ListItem<ListType> = this.firstElement;
while (li!=null) li=li.getNextItem();
//At this point, li is null.  All you're doing is assigning the newItem to your variable
li = newItem;
请注意,当下一项为空时,我们不会将
li
分配给下一项,因此它仍然指向列表中的最后一项。最后,如果列表中没有任何元素,我们需要处理:

//find last Element;
if (this.firstElement == null) {
    this.firstElement = newItem;
} else {
    var li:ListItem<ListType> = this.firstElement;
    while (li.getNextItem()!=null) li=li.getNextItem();
    //At this point, li is the last element
    li.setNextItem(newItem);
}
//查找最后一个元素;
if(this.firstElement==null){
this.firstElement=newItem;
}否则{
var li:ListItem=this.firstElement;
而(li.getNextItem()!=null)li=li.getNextItem();
//在这一点上,李是最后一个元素
li.setNextItem(新项目);
}

谢谢-事实上,我之前已经准备好了这个解决方案,然后重写了很多东西,但忘记了这一点。然而,只有当最顶层的类实例化时,一个ListItem已经准备好了,这才有效。简单地在代码中复制会导致空指针异常。第一行需要是:firstElement:ListItem=new ListItem()@EliaSweingErtner或者,您可以检查
是否(this.firstElement==null)this.firstElement=newItem;else{/*查找上面块中的最后一个元素etc*/}
。我将在中编辑它…我曾经编写过一个实现:
//find last Element;
var li:ListItem<ListType> = this.firstElement;
while (li!=null) li=li.getNextItem();
//At this point, li is null.  All you're doing is assigning the newItem to your variable
li = newItem;
//find last Element;
var li:ListItem<ListType> = this.firstElement;
while (li.getNextItem()!=null) li=li.getNextItem();
//At this point, li is the last element
li.setNextItem(newItem);
//find last Element;
if (this.firstElement == null) {
    this.firstElement = newItem;
} else {
    var li:ListItem<ListType> = this.firstElement;
    while (li.getNextItem()!=null) li=li.getNextItem();
    //At this point, li is the last element
    li.setNextItem(newItem);
}