在javascript中创建太多对象会影响性能吗?

pra*_*raj 1 javascript arrays performance object

我正在开发一个Web应用程序并在JavaScript中创建许多对象,我需要在整个会话期间维护这些对象,或者当网站打开时我将所有对象都引用到单个全局对象.它会影响webb app的性能吗?

var Obj1 = somethig;
var obj200 = something;
window.global.Obj1 = Obj1;
window.global.Obj200 = Obj200;
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 9

免责声明:我是Internet Explorer 9及更高版本中Chakra Javascript引擎的软件工程师(来自18号楼的Hello!)

简而言之:"它取决于" - 我们需要知道你正在创建多少个对象,它们有多复杂(因为JavaScript没有类,但是原型和实例),你创建它们的频率,以及你的脚本/ program会导致GC收集对象(GC运行并不漂亮).

一些技巧:

  1. 如果要存储大量简单数据对象,请使用数组来利用运行时所具有的任何优化.如果您使用的是数组,请确保所有元素都具有相同的基础类型(例如,不要将JavaScript对象与同一数组中的数字混合).
  2. JavaScript被垃圾收集 - 这意味着它具有与之相关的所有缺点,包括在GC运行时暂停整个脚本执行.如果有很多对象可以一次性收集,那么GC暂停将运行一段时间.注意内存碎片.
  3. 避免实例属性(即使用原型属性或构造函数属性),即:

坏:

for(var i = 0; i < 1000; i++ ) {
    var foo = { baz: function() { return 5; } };
    foo.bar();
}
Run Code Online (Sandbox Code Playgroud)

好:

function Foo() { } // `Foo` constructor.

Foo.prototype.baz = function() { return 5; };

for(var i=0; i < 1000; i++ ) {
    var foo = new Foo();
    foo.bar();
}
Run Code Online (Sandbox Code Playgroud)

也不错:

 function Foo() { } 

 Foo.baz = function(foo) { return 5; };

 for(var i=0; i < 1000; i++ ) {
    var foo = new Foo();
    Foo.bar( foo );
 }
Run Code Online (Sandbox Code Playgroud)

至于你的代码示例,如果你在根范围内(被调用global,在浏览器中被window对象别名),则var关键字具有创建属性的效果.所以这:

var Obj1 = somethig;
var obj200 = something;
window.Obj1 = Obj1; // there is no `window.global` object
window.Obj200 = Obj200;
Run Code Online (Sandbox Code Playgroud)

...实际上并没有做任何事情:var Obj1 此相同window.Obj1.

最后,一个protip:只给出Constructor函数TitleCase名,否则为其他所有(vars,parameters,locals等)lowerCase命名.召唤一个实例Obj1让我的脸抽搐了一下.

与往常一样,黄金法则适用:过早优化是所有邪恶的根源 - 在对代码进行重大更改之前首先查看代码以查看是否存在问题(IE 11的F12工具非常适合检查内存和处理性能你的代码,顺便说一下 - 不是我不偏不倚!).