Javascript 对象';s属性访问和普通变量访问?

Javascript 对象';s属性访问和普通变量访问?,javascript,arrays,performance,object,properties,Javascript,Arrays,Performance,Object,Properties,在完全定义我的问题之前,我必须说,尽管存在可能的浏览器优化,但访问对象的属性比访问局部变量(但不一定是全局变量或父函数的变量)更昂贵 酒店越深,您受到的性能影响就越大。换句话说, for(var x=0; x<65536; x++) doSomething(objArray[0].property1, objIDX=0); 为了回答您的“疑问”,我建议使用来对代码进行基准测试。除非经过测试,否则不能仅凭代码来判断该过程是否比其他过程快 此外,我建议您在构建过程中使用数组和对象的文字

在完全定义我的问题之前,我必须说,尽管存在可能的浏览器优化,但访问对象的属性比访问局部变量(但不一定是全局变量或父函数的变量)更昂贵

酒店越深,您受到的性能影响就越大。换句话说,

for(var x=0; x<65536; x++) 
 doSomething(objArray[0].property1, objIDX=0); 
为了回答您的“疑问”,我建议使用来对代码进行基准测试。除非经过测试,否则不能仅凭代码来判断该过程是否比其他过程快

此外,我建议您在构建过程中使用数组和对象的文字表示法,而不是
new
表示法:

var objArray=[
    {
        property : 'some string property'
    }, {
        ...
    },
];
另外,根据您的代码,最好是这样,因为每次迭代都使用相同的对象:

var obj = objArray[0].property1,
    objIDX = 0;

for(var x=0; x<65536; x++){
    doSomething(obj,objIDX);
}
var obj=objArray[0]。属性1,
objIDX=0;

对于(var x=0;x我意识到这并不能完全回答您的问题(因为它已经得到了回答),然而,您似乎正在寻找与发生数千次的函数调用相关的速度改进(其他发现这一点的人可能也在这样做)。我想我应该在这里包括这一点,因为这与假设相反:

一个示例函数:

var go = function (a,b,c,d,e,f,g,h) {
  return a+b+c+d+e+f+g+h;
}
var i=500000; while(i--){
  go(1,2,3,4,5,6,7,8);
}
var go = function (a,b,c,d,e,f,g,h, i) {
  if ( go.args ) {
    i = go.args;
    a = i[0]; b = i[1];
    c = i[2]; d = i[3];
    e = i[4]; f = i[5];
    g = i[6]; h = i[7];
  }
  return a+b+c+d+e+f+g+h;
}
以下是通常调用重复函数的方式:

var go = function (a,b,c,d,e,f,g,h) {
  return a+b+c+d+e+f+g+h;
}
var i=500000; while(i--){
  go(1,2,3,4,5,6,7,8);
}
var go = function (a,b,c,d,e,f,g,h, i) {
  if ( go.args ) {
    i = go.args;
    a = i[0]; b = i[1];
    c = i[2]; d = i[3];
    e = i[4]; f = i[5];
    g = i[6]; h = i[7];
  }
  return a+b+c+d+e+f+g+h;
}
但是,如果这些参数中没有一个(或少数几个)因函数的这种特殊用法而改变,那么最好是这样做(从速度pov-显然不是异步pov):

为了使上述功能正常工作,只需对原始功能稍作修改:

var go = function (a,b,c,d,e,f,g,h) {
  return a+b+c+d+e+f+g+h;
}
var i=500000; while(i--){
  go(1,2,3,4,5,6,7,8);
}
var go = function (a,b,c,d,e,f,g,h, i) {
  if ( go.args ) {
    i = go.args;
    a = i[0]; b = i[1];
    c = i[2]; d = i[3];
    e = i[4]; f = i[5];
    g = i[6]; h = i[7];
  }
  return a+b+c+d+e+f+g+h;
}
第二个函数的运行速度要快得多,因为您没有传入任何参数(不使用参数调用的函数启动起来非常快)。从.args数组中提取值似乎也没有那么高的成本(除非涉及字符串)。即使您更新一个或两个参数,速度仍然快得多,这使得它非常适合像素或图像数据操作,因为您通常只移动x&y:

var i=500000; go.args = [1,2,3,4,5,6,7,8];
while(i--){
  go.args[2] = i;
  go();
}

因此,在某种程度上,这是一个对象属性可以比局部变量更快的例子-如果有点复杂和离题;)

另一个微妙的增强(在已经提到的基础上)可以使用
x=65536;而(x-){doSomething(…);}
而不是用于。。。但前提是计数器是否向后移动无关紧要。从理论上讲,您不能将
doSomething
函数作为本地变量进行本地缓存吗?