JavaScript-属性和变量

JavaScript-属性和变量,javascript,memory,Javascript,Memory,在我的代码中,我要删除自定义对象。我意识到,我们不能删除使用“var”声明的对象。(阅读本文档后) 我的大多数对象都是使用“var”声明和初始化的。不能在单个delete语句中删除它们(除非我循环并删除每个属性) 我可以将它们设置为“null” 我的自定义对象的大小相对较大(可能会阻塞大量内存) 为了更好的内存管理和性能,我应该使用“属性”还是“变量”来存储我的对象?这会有所不同吗 请提供任何参考资料,以便更好地了解javascript中的“属性”和“变量” globalProp = {//

在我的代码中,我要删除自定义对象。我意识到,我们不能删除使用“var”声明的对象。(阅读本文档后)

  • 我的大多数对象都是使用“var”声明和初始化的。不能在单个delete语句中删除它们(除非我循环并删除每个属性) 我可以将它们设置为“null”
  • 我的自定义对象的大小相对较大(可能会阻塞大量内存)
为了更好的内存管理和性能,我应该使用“属性”还是“变量”来存储我的对象?这会有所不同吗

请提供任何参考资料,以便更好地了解javascript中的“属性”和“变量”

globalProp = {//can be deleted, it is a 'property' to global object.
'name': 'Mia',
'age': 34,
'sex': 'F'
};

var globalVar = {//can not be deleted with delete statement, it is variable of global object
'name': 'Lia',
'age': 25,
'sex': 'F'
};
(在上面的代码中,我们可以将globalProp称为'window.globalProp',但不能将globalVar称为window.globalVar。)


JavaScript具有运行时和垃圾收集器以及一些复杂的清理和管理算法,任何试图干扰或加速它们的行为都会适得其反,导致一些运行时惩罚。最好将内存管理留给底层运行时

但是,您可能需要考虑以下几点:
1) 尽量避免使用全局变量。对于任何支持全局/静态变量的语言,这都是一个很好的建议。全局变量意味着没有作用域的全局引用-只要(全局)引用保持它,被引用的对象就会继续存在。如果全局变量是一个数组或对象,而该数组或对象不断向其自身附加子变量,则这种危险会更大。 这是导致托管语言内存泄漏的常见情况
2) 避免循环引用-不要使一个成员变量指向另一个对象,该对象包含指向第一个对象的成员。这将给垃圾收集器带来困难。
3) 编写干净、简单、可维护的代码。这似乎与说教无关,但更简单、简短、可维护的代码可能会增强interperter/编译器优化代码的能力。
4) 不要假设代码对速度有什么影响。下面有很多层,你不能简单地假设任何东西。对代码进行基准测试以获得真实的事实。
5) 除非你需要,否则不要优化(你可能不需要)

因此,对于您的问题:尽可能多地使用
var
声明任何内容。使用
var
声明变量将使它们成为局部变量-当函数结束时,引用将超出范围,GC可以提前开始确定对象的销毁时间。在没有
var
的情况下声明对象将使它们成为全局对象-不清楚GC何时会决定删除该对象,从而减慢速度。
正如您所知,声明全局变量可能会导致许多错误,并保持其范围。不要使用
删除
。这完全是错误的。

更正了我问题中的一句话。在javascript中,您通常可以让垃圾收集器处理您的对象,并且几乎不需要使用
delete
操作符。你为什么这么担心内存管理?你想做什么?我根据用户选择的选项调用web服务。我得到了很多信息,我将这些信息解析并存储在一个对象中。此信息进一步用于在网页上绘制图形。。。每次我从web服务获取新信息时,用户还可以继续更改其选项。我想删除已创建的对象…最后,我要做的就是确保删除所有指向对象的引用。如果指向对象的变量在函数中,那么当函数经常完成时,它们将超出范围,您无需执行任何操作。如果您使用的是全局变量,那么将变量设置为不同的值(例如null)就可以了。