我正在尝试删除树中的根节点,并且树只有一个节点。由于“this”指的是节点的当前上下文,因此我将其设置为null this = null;
(下面代码的情况2)。但是,我收到错误信息:ReferenceError: Invalid left-hand side in assignment
。一种方法是使用delete this.val;
(案例1)。
我的问题:为什么我不能设置this = null;
来删除树对象?另一种删除obj的方法?谢谢。
var BST = function(val) {
this.val = val;
this.left = null;
this.right = null;
}
BST.prototype.remove = function(val) {
//delete this.val; // Case 1: OK
this = null; // Case 2: WRONG !
}
BST.prototype.printTree = function() {
if (this === undefined) {
return;
} else
console.log(this.val);
}
var bst = new BST(70);
bst.remove(70);
bst.printTree();
答案 0 :(得分:2)
一旦对您的对象的所有引用都消失了,它就会被清除。因此,如果this.left
和this.right
也是树,则将this.left
或this.right
设置为null
将删除这些树,如果没有其他引用的话。换句话说,您可以通过从父节点而不是从节点中删除节点来删除节点。
答案 1 :(得分:1)
this
是javascript中的关键字,不应位于作业的左侧,例如此处(案例2):this = null
。
执行delete this.val;
(案例1)时,您将从val
在函数范围内表示的任何上下文中删除属性this
(在您的情况下为BST,因为它是原型功能)。
我相信您需要重构代码以使用root或父节点执行分支删除。像:
BST.prototype.remove = function(branchToDeleteRef) {
this[branchToDeleteRef] = null;
}
如果您使用this.val = null
,它也会有效,例如fiddle。