Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在javascript中创建太多对象是否会影响性能?_Arrays_Performance_Object_Javascript - Fatal编程技术网

Arrays 在javascript中创建太多对象是否会影响性能?

Arrays 在javascript中创建太多对象是否会影响性能?,arrays,performance,object,javascript,Arrays,Performance,Object,Javascript,我正在开发一个web应用程序,并用JavaScript创建许多对象,我需要在整个会话期间或网站打开时维护这些对象,并且我正在使所有对象引用单个全局对象。它会影响webb应用程序的性能吗 var Obj1 = somethig; var obj200 = something; window.global.Obj1 = Obj1; window.global.Obj200 = Obj200; 免责声明:我是InternetExplorer9及更高版本中ChakraJavaScript引擎的软件工程

我正在开发一个web应用程序,并用JavaScript创建许多对象,我需要在整个会话期间或网站打开时维护这些对象,并且我正在使所有对象引用单个全局对象。它会影响webb应用程序的性能吗

var Obj1 = somethig;
var obj200 = something;
window.global.Obj1 = Obj1;
window.global.Obj200 = Obj200;

免责声明:我是InternetExplorer9及更高版本中ChakraJavaScript引擎的软件工程师(来自18号楼的您好!)

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

一些提示:

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

    …实际上什么都不做:
    var Obj1
    window.Obj1
    是一样的

    最后,一个protip:只给出构造函数的
    TitleCase
    名称,否则所有其他函数(变量、参数、局部变量等)
    lowerCase
    名称。调用实例
    Obj1
    使我的脸抽搐


    一如往常,黄金法则适用:过早优化是万恶之源-在对代码进行重大更改之前,先分析一下代码是否存在问题(顺便说一句,IE 11的F12工具非常适合检查代码的内存和处理性能-我不是没有偏见!)。

    “太多了”这意味着超出了需要,这本身就是一个问题。请注意,您显示的代码段没有创建任何对象。它只是分配变量和属性来指向已经存在的变量和属性。我假设
    something
    是一个对象文字。同样值得澄清的是,即使不使用
    var
    关键字,变量也会自动成为window的一个属性,这实际上要糟糕得多,尤其是在函数内部。此外,不能删除使用
    var
    关键字声明的变量:
    var x=7;删除x将失败,其中
    y=3;删除y
    将成功删除变量,并因此对其进行GCing。@Isos使用
    delete
    运算符仅从其父对象中删除属性;它不一定触发GC,也不为GC提供内存,GC也不必首先收集对象。不必要的
    delete
    ing属性只是浪费周期。因此,如果我在内存中有某个对象,这是window的一个属性,并且删除成功,该对象会发生什么情况?@istos如果任何其他对象持有对已删除属性持有的值的引用,则它将保留在内存中。如果GC确定没有对该对象的强引用(与弱引用比较,例如WeakMap),则将收集该对象并释放内存。GC传递是非确定性的,并且不是由
    delete
    操作触发的。谢谢您,非常感谢。
    for(var i = 0; i < 1000; i++ ) {
        var foo = { baz: function() { return 5; } };
        foo.bar();
    }
    
    function Foo() { } // `Foo` constructor.
    
    Foo.prototype.baz = function() { return 5; };
    
    for(var i=0; i < 1000; i++ ) {
        var foo = new Foo();
        foo.bar();
    }
    
     function Foo() { } 
    
     Foo.baz = function(foo) { return 5; };
    
     for(var i=0; i < 1000; i++ ) {
        var foo = new Foo();
        Foo.bar( foo );
     }
    
    var Obj1 = somethig;
    var obj200 = something;
    window.Obj1 = Obj1; // there is no `window.global` object
    window.Obj200 = Obj200;