【发布时间】:2011-09-03 08:13:40
【问题描述】:
点运算符比下标符号快吗?
var obj = {x: '5'};
obj.x = 'some value';
obj['x'] = 'some value';
【问题讨论】:
-
将此代码与其他代码放在上下文中会有所帮助,然后根据与其他代码的比例来考虑惩罚。如果某些功能确实被认为异常缓慢,它通常会从语言中删除(例如
with已被弃用)
点运算符比下标符号快吗?
var obj = {x: '5'};
obj.x = 'some value';
obj['x'] = 'some value';
【问题讨论】:
with 已被弃用)
没有什么令人难以置信的担心。不过,window 或 eval 访问变量的速度要慢得多。
【讨论】:
obj[x] = ...) 这可能是因为如果字符串是常量,JIT 编译器可以预先搜索字符串,因此它与点表示法“等效”,但如果字符串在变量中,JIT 可以t 优化它并且必须在运行时进行。
这可能是过时的信息,但它是至少影响旧 Safari 版本的声明。 来自 O'Reilly 的Writing Efficient JavaScript:
对于大多数浏览器,使用 dot 几乎没有区别 对象属性访问 (data.count) 的表示法和括号表示法 (数据[“计数”])。一个例外是 Safari,其中括号表示法 比点符号慢得多。即使对于 Safari 4 及更高版本使用 Nitro JavaScript 引擎。
看起来http://jsperf.com/ 已被删除——上面写着Website Disabled,但是使用来自Qt4 的嵌入式WebKit 引擎,使用这个测试,看起来这个陈述是正确的:
var t = new Date().getTime();
var x = { c: 123 };
for (var i = 0; i < 5000000; i++)
x['c'] += 2;
document.write(( new Date().getTime() - t ) + '; value ' + x.c);
var t = new Date().getTime();
var x = { c: 123 };
for (var i = 0; i < 5000000; i++)
x.c += 2;
document.write(( new Date().getTime() - t ) + '; value ' + x.c);
使用 x['c'] 大约需要 4 秒,而 x.c 运行大约 3 秒。
当前的 Firefox 和 Chrome 似乎对两者没有区别。
【讨论】: