匿名JavaScript对象占用内存吗?
如果我有以下代码:匿名JavaScript对象占用内存吗?,javascript,Javascript,如果我有以下代码: var a = {a:1,b:2,c:3} ['a'] var b = {a:1,b:2,c:3} ['b'] 我创建了两个匿名JavaScript对象。匿名JavaScript对象是否占用内存?或者它们是即时垃圾收集的吗?下面是一个垃圾收集工作原理的示例,与您的问题类似,您会注意到o2.a与您的场景类似。还应注意,由于对象的一部分仍在使用中,因此整个变量仍在使用中 var o = { a: { b:2 } }; // 2 objects are cre
var a = {a:1,b:2,c:3} ['a']
var b = {a:1,b:2,c:3} ['b']
我创建了两个匿名JavaScript对象。匿名JavaScript对象是否占用内存?或者它们是即时垃圾收集的吗?下面是一个垃圾收集工作原理的示例,与您的问题类似,您会注意到o2.a与您的场景类似。还应注意,由于对象的一部分仍在使用中,因此整个变量仍在使用中
var o = {
a: {
b:2
}
};
// 2 objects are created. One is referenced by the other as one of its property.
// The other is referenced by virtue of being assigned to the 'o' variable.
// Obviously, none can be garbage-collected
var o2 = o; // the 'o2' variable is the second thing that
// has a reference to the object
o = 1; // now, the object that was originally in 'o' has a unique reference
// embodied by the 'o2' variable
var oa = o2.a; // reference to 'a' property of the object.
// This object has now 2 references: one as a property,
// the other as the 'oa' variable
o2 = "yo"; // The object that was originally in 'o' has now zero
// references to it. It can be garbage-collected.
// However what was its 'a' property is still referenced by
// the 'oa' variable, so it cannot be free'd
oa = null; // what was the 'a' property of the object originally in o
// has zero references to it. It can be garbage collected.
所以一般来说,我会说,是的,它们仍然占用内存
但是,我也怀疑许多浏览器会足够聪明,能够发现您只在该行上创建了对象,并且只分配了其中的一部分,因此没有理由保留整个对象,并且可能会删除它。但一般来说,只要a或b变量存在,内存就会被使用 每个匿名对象在用于属性查找时都必须存在,因此在此期间需要占用内存。属性查找完成后,对象将不再使用,因此它将成为垃圾
无法保证垃圾将在何时被真正收集,因此在这些行运行之后,对象可能仍然存在于内存中。但是它们符合垃圾收集的条件,将来JavaScript引擎需要为其他数据释放内存时,它们将被收集。表达式匿名JavaScript对象有点奇怪。JavaScript对象只是对象,本身没有名称。它们可以被其他事物引用,也可以不被其他事物引用,包括但不限于分配给它们的变量。例如,考虑以下情况:
function make_getter(obj) { return function(p) { return obj[p]; }; }
var getter = make_getter({a: 1});
这里{a:1}是匿名的,但由于它被关闭,在make_getter返回并分配给getter的函数中被引用,只要getter仍在作用域中,对象就不能也不会被垃圾收集
对象是否被垃圾回收与是否在某个活动上下文中被引用有关,而不仅仅是它是否被分配给变量。它可能被分配给一个变量,但已超出范围;或者,它可能没有分配给变量,但仍然存在于某个范围内
正如其他帖子所提到的,实际的GC发生在引擎感觉像它的时候,而你没有或者不需要控制它
换言之,以下两个片段在GC方面是相同的:
function gc1() {
return {a:1, b:2, c:3}['a'];
}
function gc2() {
var o = {a:1, b:2, c:3};
return o['a'];
}
没有人在乎你是否给这个物体起了个名字。问题是它何时超出范围,在本例中,超出范围发生在函数末尾。所有内容都需要内存。然后它被释放,一段时间后垃圾被收集。垃圾收集依赖于特定浏览器中使用的实现ie javascript引擎,因此无法猜测。不用担心,只要根据需要使用它们就行了这是一个实现细节。我可以想象,在这个简单的例子中,大多数现代引擎都会优化对象。“你有更真实的例子吗?”斯奎特说。。不太确定“do”,因为这是一个非常罕见的用法。但是有一些令人印象深刻的前端优化。关于您的更新:您发布的代码是JavaScript,而不是JSON。现在还不清楚为什么要回滚将其更改为JavaScript的编辑。但它不是JSON,而是一个JavaScript对象。JSON是用于数据序列化的文本格式:如果您编写了JSON.parse{a:1,b:2,c:3},那么您将使用JSON作为创建JavaScript对象的一种方式。字符串是JSON;通过解析生成的对象——或者在本例中,是您直接在源代码中编写的对象文本,而无需从JSON解析——是一个普通的JavaScript对象。