【问题标题】:JavaScript- properties and variablesJavaScript-属性和变量
【发布时间】:2014-06-27 06:54:19
【问题描述】:

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

  • 我的大部分对象都是使用“var”声明和初始化的。它们不能在单个删除语句中删除(除非我循环遍历它并删除每个属性。) 我可以将它们设置为“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。)

Have fiddle

【问题讨论】:

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

标签: javascript memory


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 2012-07-06
    • 2020-01-19
    • 2014-03-05
    • 1970-01-01
    • 2021-11-28
    • 2019-11-02
    相关资源
    最近更新 更多