免责声明:我是 Internet Explorer 9 及更高版本中 Chakra Javascript 引擎的软件工程师(来自 Building 18 的您好!)
简而言之:“视情况而定”——我们需要知道你创建了多少对象,它们有多复杂(因为 JavaScript 没有类,但有原型和实例),你创建它们的频率,以及如果您的脚本/程序会导致 GC 收集对象(并且 GC 运行不漂亮)。
一些提示:
- 如果您要存储大量简单的数据对象,请使用数组来利用运行时将进行的任何优化。如果您使用的是数组,请确保所有元素都具有相同的底层类型(例如,不要将 JavaScript 对象与数字混合在同一个数组中)。
- JavaScript 是垃圾收集的 - 这意味着它具有与之相关的所有缺点,包括在 GC 运行时暂停整个脚本执行。如果大量对象同时可供收集,则 GC 暂停将运行一段时间。还要注意内存碎片。
- 避免实例属性(即使用原型属性或构造函数属性),即:
不好:
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 );
}
至于您的代码示例,如果您在根范围内(称为global,在浏览器中以window 对象为别名),则var 关键字具有创建属性的效果。所以这个:
var Obj1 = somethig;
var obj200 = something;
window.Obj1 = Obj1; // there is no `window.global` object
window.Obj200 = Obj200;
...实际上并没有做任何事情:var Obj1 是和window.Obj1一样的东西。
最后,一个小提示:只给构造函数TitleCase 名称,否则所有其他(变量、参数、本地变量等)lowerCase 名称。调用实例Obj1 让我的脸抽搐。
与往常一样,黄金法则适用:过早优化是万恶之源-首先分析您的代码以查看是否存在问题,然后再对您的代码进行重大更改代码(而且 IE 11 的 F12 工具非常适合检查代码的内存和处理性能,顺便说一句 - 并不是说我没有偏见!)。