通过变量赋值或调用函数访问属性?

Nur*_*ony 1 javascript performance

我正在阅读accessing object properties as variableAirbnb的风格指南中的部分,该指南说它很好地访问下面的属性

var luke = {
  jedi: true,
  age: 28
};

function getProp(prop) {
  return luke[prop];
}

var isJedi = getProp('jedi');
Run Code Online (Sandbox Code Playgroud)

所以我定义了一个像波纹管一样的通用函数

function getProp(obj, prop) {
   if (obj.hasOwnProperty(prop)) {
       return obj[prop];
   } else {
       var msg = prop + ' is not a property of the object' + 
                 'you are trying to access';
       throw Error(msg);
   }
}
Run Code Online (Sandbox Code Playgroud)

并打电话给

var isJedi = getProp(luke, 'jedi');
Run Code Online (Sandbox Code Playgroud)

调用函数访问对象属性与仅在需要的变量中分配它会对性能产生什么影响?

T.J*_*der 5

调用函数访问对象属性与仅在需要的变量中分配它会对性能产生什么影响?

从绝对意义上讲,理论上它是巨大的,因为你正在做所有的工作,调用一个函数,传递参数,创建一个新的执行上下文等等.

然而,当我测量这个因为我担心使用的影响时forEach,我发现函数调用真的非常快,即使是当时我能找到的最慢的JavaScript引擎(IE6中的JScript).和现代的发动机是很多比IE6的JScript的速度更快.

我更大的担忧不是表现,而是:

  1. 对代码可读性的影响,

  2. (对于getProp您所展示的具体情况),您正在禁用JavaScript的一个关键功能:原型链(通过要求属性为"自己的"属性)

更多关于可读性:

通常需要访问嵌套对象层次结构,例如:

var n = obj.foo.thingies.length;
Run Code Online (Sandbox Code Playgroud)

考虑一下它的外观getProp:

var n = getProp(getProp(getProp(obj, "foo"), "thingies"), "length");
Run Code Online (Sandbox Code Playgroud)

坦率地说,这几乎是不可读的.

除非有一个非常好的理由,我会以正常的方式使用属性.