为什么JavaScript中的变量要慢得多
why are variables in javascript much slower?
var completeObj = {a: { b: { c: { d: { e: { f: 23 } } } } } };
var funcA = function(obj){
var a = 'a',b='b',c='c',d='d',e='e',f='f';
return obj[a][b][c][d][e][f];
}
var funcB = function(obj){
return obj['a']['b']['c']['d']['e']['f'];
}
funcA 比 funcB 慢得多,在范围内寻找变量需要花费这么多时间?测试网址 : http://jsperf.com/static-and-dynamic-argument感谢
http://jsperf.com/static-and-dynamic-argument/2
我拿了你的测试用例,并添加了一个测试用例来"证明一个观点"。当您通过['key']
表示法访问对象中的某些内容时,您正在执行与通过.key
访问它相同的操作。编译器足够聪明,知道['a']
等同于.a
。但是,当您将变量粘贴在那里时,正如Bergi在他的评论中提到的那样,编译器不知道[a]
实际上是['a']
。
这是因为局部变量(函数范围(成为内部Variable
对象的属性。因此,对 obj[a][b][c][d][e][f]
的调用最终会首先访问Variable
对象上通过f
a
的属性,然后在completeObj
上访问属性。
它与变量或变量范围无关(纯局部变量实际上是免费的(,而是使用反射来访问属性而不是常量。
obj['a']['b']['c']['d']['e']['f'];
等于 obj.a.b.c.d.e.f
,因此即使从源代码中也知道将访问哪些属性。
括号表示法与变量一起使用需要在运行时确定将访问哪些属性,因此完全不同。在Java中,前者代码类似于使用反射库访问属性,而后者与使用普通的静态点访问相同。
那么为什么编译器没有"意识到"变量也是静态的呢?好吧,你的代码是完全不合理的,JIT浪费时间优化不合理的代码是一个糟糕的JIT。
为什么它意识到['a']
和.a
一样?好吧,至少根据我的经验,让解析器吐出相同的 MemberAccess 对象以进行点和括号访问,然后只检查表达式是否为常量字符串要简单得多。
- 调用类向后变量 (JavaScript)
- 初始化父类中的变量(JavaScript/CoffeeScript 习语)
- 可以'找不到变量javascript错误
- 输出数组变量javascript
- 自提交表单访问变量javascript
- 将变量 javascript 添加到用于旋转图像的链接中
- 在文本字段中显示保存的本地存储变量 - javascript
- 将变量添加到变量 JavaScript 中
- 获取要在变量 JavaScript 中使用的用户输入值
- 如何在变量 Javascript 中删除双引号
- 使用变量 javascript 从 json 文件中获取数据
- 读取输入和打印变量 - JavaScript 和 HTML 4.01
- 传递 PHP 变量 JavaScript 窗口位置
- 重置变量 JavaScript
- 变量 JavaScript 中的变量
- 尝试使用多个函数时无法使用全局变量 - JavaScript - 初学者
- 如何按值将数组分配给另一个变量 JavaScript
- setTimout 搞砸了变量 JavaScript
- 用内部函数变量更改外部函数变量?Javascript
- 根据变量 JavaScript 增加