使用JavaScript数组,我可以用一个赋值将其重置为空状态:
array.length = 0;
这使得数组“显示”为空,可以重用,据我所知,这是一个单一的“操作”——也就是说,常数时间。
有没有类似的方法来清除JS对象?我知道我可以迭代它的字段删除它们:
for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }
但这有线性复杂度。
我也可以扔掉这个对象并创建一个新的对象:
obj = {};
但是“混杂”创建新对象会导致IE6上的垃圾收集问题。(如下所述)
所以重述一下你的问题:你想尽量避免IE6 GC bug带来的麻烦。这个错误有两个原因:
每隔这么多次分配就会发生一次垃圾收集;因此,你做的分配越多,GC就会运行得越频繁;
“在空中”的对象越多,每次垃圾收集运行所需的时间就越多(因为它会遍历整个对象列表,以查看哪些对象被标记为垃圾)。
原因1的解决方案似乎是:减少分配的数量;尽可能少地分配新对象和字符串。
原因2的解决方案似乎是:减少“活动”对象的数量;删除你的字符串和对象,一旦你不再需要它们,并在必要时重新创建它们。
在某种程度上,这些解决方案是矛盾的:为了保持内存中的对象数量较低,将需要更多的分配和回收分配。相反,不断重用相同的对象可能意味着在内存中保留更多的对象,而不是严格必要的对象。
现在回答你的问题。你是通过创建一个新的对象来重置一个对象,还是通过删除它的所有属性来重置一个对象:这将取决于你之后想对它做什么。
你可能想要给它分配新的属性:
如果您立即这样做,那么我建议直接分配新属性,并跳过删除或清除。(但是,请确保所有属性都被覆盖或删除!)
如果该对象不会立即被使用,但会在稍后的某个阶段重新填充,那么我建议删除它或将其赋值为空,并在稍后创建一个新的对象。
没有一种快速、简单的方法可以清除JScript对象以便重用,就像它是一个新对象一样——而不需要创建一个新对象。这意味着对你问题的简短回答是“不”,就像jthompson说的那样。
所以重述一下你的问题:你想尽量避免IE6 GC bug带来的麻烦。这个错误有两个原因:
每隔这么多次分配就会发生一次垃圾收集;因此,你做的分配越多,GC就会运行得越频繁;
“在空中”的对象越多,每次垃圾收集运行所需的时间就越多(因为它会遍历整个对象列表,以查看哪些对象被标记为垃圾)。
原因1的解决方案似乎是:减少分配的数量;尽可能少地分配新对象和字符串。
原因2的解决方案似乎是:减少“活动”对象的数量;删除你的字符串和对象,一旦你不再需要它们,并在必要时重新创建它们。
在某种程度上,这些解决方案是矛盾的:为了保持内存中的对象数量较低,将需要更多的分配和回收分配。相反,不断重用相同的对象可能意味着在内存中保留更多的对象,而不是严格必要的对象。
现在回答你的问题。你是通过创建一个新的对象来重置一个对象,还是通过删除它的所有属性来重置一个对象:这将取决于你之后想对它做什么。
你可能想要给它分配新的属性:
如果您立即这样做,那么我建议直接分配新属性,并跳过删除或清除。(但是,请确保所有属性都被覆盖或删除!)
如果该对象不会立即被使用,但会在稍后的某个阶段重新填充,那么我建议删除它或将其赋值为空,并在稍后创建一个新的对象。
没有一种快速、简单的方法可以清除JScript对象以便重用,就像它是一个新对象一样——而不需要创建一个新对象。这意味着对你问题的简短回答是“不”,就像jthompson说的那样。