用.或[]访问对象属性 - 有什么区别?

NIN*_*OOP 6 actionscript object actionscript-3

下面写的代码(i)和(ii)有什么区别?

(一世)

var obj:Object = new Object();
obj.attribute = value ;
Run Code Online (Sandbox Code Playgroud)

(ⅱ)

var obj:Object = new Object();
obj["key"] = value;
Run Code Online (Sandbox Code Playgroud)

如果我写这个,是否有任何运行时的影响:

var obj:Object = new Object();
obj.somekey = value1 ;
obj["someKey"] = value2 ;
Run Code Online (Sandbox Code Playgroud)

请解释.

wel*_*rat 21

不同之处在于查找机制:如果使用点语法,编译器将在编译时知道您正在访问该对象的属性.如果您使用括号语法,该财产的实际查找在运行时进行,并且有将不得不更多的类型检查 - 毕竟,你可以动态地组成密钥字符串,其值可以改变,或者你甚至可以调用函数而不是变量等

结果是性能上的显着差异:Bracket语法的执行时间大约是点语法的三倍.

这里有一个小速度测试来说明我的观点:

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));
Run Code Online (Sandbox Code Playgroud)

如果两者相同,除了符号,它们应该花费相同的时间.但正如你所看到的,事实并非如此.在我的机器上:

Time with dot syntax:      3937
Time with bracket syntax:  9857
Run Code Online (Sandbox Code Playgroud)