在Javascript中重新分配对象变量时,原始对象会发生什么变化?

在Javascript中重新分配对象变量时,原始对象会发生什么变化?,javascript,class,variables,object,declaration,Javascript,Class,Variables,Object,Declaration,让我们在开始时说,我们将: class AI { // class properties/methods here } var chappie = new AI; 使用变量后,如果要通过调用重置变量: chappie = new AI; 原始对象会发生什么变化?垃圾被收集了吗?这是允许的,还是有更好的方法“重置”变量?如果不再引用对象,那么该对象最终将被垃圾收集 如果您最初有一个引用,而现在没有引用,那么最终将释放内存 var obj = { }; var a = obj; var b =

让我们在开始时说,我们将:

class AI {
// class properties/methods here
}
var chappie = new AI;
使用变量后,如果要通过调用重置变量:

chappie = new AI;

原始对象会发生什么变化?垃圾被收集了吗?这是允许的,还是有更好的方法“重置”变量?

如果不再引用对象,那么该对象最终将被垃圾收集

如果您最初有一个引用,而现在没有引用,那么最终将释放内存

var obj = { };
var a = obj;
var b = obj;
a = null;
仍然有一个引用,所以没有任何更改

至于另一个问题:“我如何重置变量?” 我的后续问题是“为什么?”

如果希望GC启动,则可以将var设置为
null
undefined
或其他任何值(假设这是最后一次引用对象)

…否则,当任何东西不再需要var时,GC也会清理var本身。
如果被删除的var是对某个值的最后一个引用,那么该值将被清除。

除非有另一个引用,否则它将被GC删除。这是删除不需要的内存分配的公认方法。调用取消引用。取决于“重置”的含义。您将创建一个新对象并将其分配给该变量。但是,如果您只是想丢弃上一个对象,请将变量设置为null,而不要创建新的对象。有点不清楚你的意图是什么。“有更好的方法吗”。。。如果您只想覆盖原始文件,则可能不会删除原始文件,直到它们超出范围。最好使用
undefined
而不是
null
,因为undefined具有比null更有意义的上下文含义。另外,
null
被序列化为JSON,而
undefined
被忽略。@Blindman67:
null
的意思是“无对象”,这正是这里首选的。@Bergi null是一个占位符。这意味着目前该变量没有适用的值,但我们希望保留(保留)该变量,以备将来需要。Undefined是字面意思,指不存在的未定义实体。它被指定为表示不再需要变量,并且不再具有有意义的上下文。与可以转储的未定义变量不同,在序列化/传输/克隆期间,必须保留值为null的变量。如果您不再使用某个变量,请将其设置为“未定义”。@Blindman67。我同意undefined在符号上比null更正确,但在JS中,undefined表示未声明的变量和
var test=undefined
。因此,当
test
未声明和
test
分配为未定义时,典型的安全检查(
typeof test====“undefined”
)将不幸地返回true。分配
test=null
首先允许进行适当的安全检查(
typeof test==“undefined”
),然后允许
if(test==null)
。还有……(他轻轻地说,所以没人听见)。。。null只能键入4个字符,而undefined只能键入9个字符:-O@markE引用MDN“然而,这种技术应该避免。”参考
typeof?==“undefined”
并且他们认为不需要进行此测试是正确的,因为您应该知道变量的范围并将其作为属性引用
window[“v”]==未定义
广泛使用
null
而不是
undefined
意味着我必须检查参数
arg!==未定义的&&!==无效的arg:defV
,它既丑陋又低效。对于保存的5个字符(我知道这是它的使用流行的原因),意味着我必须为每个可选参数添加13个字符。这让我烦透了…:P