使用 .或 [ ] 访问对象属性 - 有什么区别? [英] Using . or [ ] to access Object properties - what's the difference?
问题描述
下面写的代码(i)和(ii)有什么区别?
What is the difference between the code (i) and (ii) written below ?
(i)
var obj:Object = new Object();
obj.attribute = value ;
(ii)
var obj:Object = new Object();
obj["key"] = value;
如果我这样写是否有任何运行时影响:
Are there any run-time implications if I write this :
var obj:Object = new Object();
obj.somekey = value1 ;
obj["someKey"] = value2 ;
请解释.
推荐答案
区别在于查找机制:如果您使用点语法,编译器将在编译时知道您正在访问该对象的属性.如果使用括号语法,则属性的实际查找是在运行时完成的,并且必须进行更多类型检查 - 毕竟,您可以动态组合键字符串,值可以更改,或者您甚至可以调用一个函数而不是一个变量等.
The difference is in the lookup mechanism: If you use the dot syntax, the compiler will know at compile time that you are accessing a property of that object. If you use the bracket syntax, the actual lookup of the property is done at runtime, and there will have to be more type checking - after all, you could compose the key string dynamically, the value could change, or you could even be calling a function instead of a variable, etc.
结果是性能的显着差异:括号语法的执行时间大约是点语法的三倍.
The result is a significant difference in performance: Bracket syntax takes about three times as long to execute as dot syntax.
这里有一个小速度测试来说明我的观点:
Here's a little speed test to illustrate my point:
var start : int = getTimer();
var obj:Object = { something : "something" };
for (var i : int = 0; i < 100000000; i++) {
var n:String = obj.something;
}
trace ("Time with dot syntax: "+(getTimer() - start));
start = getTimer();
for (i = 0; i < 100000000; i++) {
var o:String = obj["something"];
}
trace ("Time with bracket syntax: "+(getTimer() - start));
如果两者相同,除了符号,它们应该花费完全相同的时间.但正如你所看到的,情况并非如此.在我的机器上:
If the two were the same, except for notation, they should take exactly the same amount of time. But as you can see, this is not the case. On my machine:
Time with dot syntax: 3937
Time with bracket syntax: 9857
这篇关于使用 .或 [ ] 访问对象属性 - 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!