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

Javascript 通过变量赋值或调用函数访问属性?,javascript,performance,Javascript,Performance,我正在阅读Airbnb的《样式指南》中的“作为变量访问对象属性”一节,该节说,访问如下属性很好 var luke = { jedi: true, age: 28 }; function getProp(prop) { return luke[prop]; } var isJedi = getProp('jedi'); 所以我定义了一个泛型函数,比如bellow function getProp(obj, prop) { if (obj.hasOwnProperty(pro

我正在阅读Airbnb的《样式指南》中的“作为变量访问对象属性”一节,该节说,访问如下属性很好

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

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

var isJedi = getProp('jedi');
所以我定义了一个泛型函数,比如bellow

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);
   }
}
并称为

var isJedi = getProp(luke, 'jedi');
调用函数来访问对象属性与只在需要时将其分配到变量中对性能有什么影响

调用函数来访问对象属性与只在需要时将其分配到变量中对性能有什么影响

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

然而,因为我担心使用forEach的影响,我发现函数调用真的很快,即使是在IE6中JScript时最慢的JavaScript引擎上。现代引擎比IE6的JScript快得多

我更关心的不是性能,而是:

对代码可读性和

对于您所展示的特定getProp,您正在禁用JavaScript的一个关键特性:prototype链,因为它要求属性为自己的属性

有关可读性的更多信息:

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

var n = obj.foo.thingies.length;
考虑一下使用getProp会是什么样子:

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

除非有充分的理由这样做,否则我只会以正常的方式使用属性

调用函数来访问对象属性与只在需要时将其分配到变量中对性能有什么影响

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

然而,因为我担心使用forEach的影响,我发现函数调用真的很快,即使是在IE6中JScript时最慢的JavaScript引擎上。现代引擎比IE6的JScript快得多

我更关心的不是性能,而是:

对代码可读性和

对于您所展示的特定getProp,您正在禁用JavaScript的一个关键特性:prototype链,因为它要求属性为自己的属性

有关可读性的更多信息:

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

var n = obj.foo.thingies.length;
考虑一下使用getProp会是什么样子:

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


除非有充分的理由这样做,否则我只会以正常的方式使用属性。

此外,在未知对象上调用obj.hasOwnProperty是错误的,因为如果我这样做会怎么样{jedi:true,age:28,hasOwnProperty:cool},绝地?@melpomene:Meh,如果人们这样做,他们应该得到他们应得的。

但是,是的,为了更彻底,您应该使用Object.prototype.hasOwnProperty.callobj和propName。除非这些做这件事的怪人也走了,取而代之!你不需要任何特别的古怪。JS通常处理来自外部源的数据,例如来自AJAX调用的JSON或由或等效程序输出的内联对象文本。另一方面,如果您已经确定对象可以包含或不能包含哪些属性,那么您需要检查什么。hasOwnProperty?@melpomene:我从未见过包含hasOwnProperty键的JSON提要,是吗?你当然没有。这是一个理论问题,不是现实世界的问题-我有,因为我写了一本-另外,在未知对象上调用obj.hasOwnProperty也是一个错误,因为如果我做了{jedi:true,age:28,hasOwnProperty:cool},绝地?@melpomene:Meh,如果人们这样做,他们应该得到他们应得的东西但是,是的,为了更彻底,您应该使用Object.prototype.hasOwnProperty.callobj和propName。除非这些做这件事的怪人也走了,取而代之!你不需要任何特别的古怪。JS通常处理来自外部源的数据,例如来自AJAX调用的JSON或由或等效程序输出的内联对象文本。另一方面,如果您已经确定对象可以包含或不能包含哪些属性,那么您需要检查什么。hasOwnProperty?@melpomene:我从未见过包含hasOwnProperty键的JSON提要,是吗?你当然没有。这是一个理论问题,不是现实世界的问题-我有,因为我写了一本-