С помощью .или [] для доступа к свойствам объекта - в чем разница? - PullRequest
6 голосов
/ 01 февраля 2012

В чем разница между кодом (i) и (ii), написанным ниже?

(i)

var obj:Object = new Object();
obj.attribute = value ;

(ii)

var obj:Object = new Object();
obj["key"] = value;

Есть ли какие-либо последствия во время выполнения, если я напишу это:

var obj:Object = new Object();
obj.somekey = value1 ;
obj["someKey"] = value2 ;

Пожалуйста, объясните.

1 Ответ

21 голосов
/ 01 февраля 2012

Разница заключается в механизме поиска: если вы используете точечный синтаксис, компилятор будет знать во время компиляции, что вы обращаетесь к свойству этого объекта.Если вы используете синтаксис скобок, фактический поиск свойства выполняется во время выполнения, и потребуется дополнительная проверка типов - в конце концов, вы можете составить строку ключа динамически, значение может измениться, или вы даже можете вызыватьфункция вместо переменной и т. д.

Результатом является значительное различие в производительности: Синтаксис скобки выполняется примерно в три раза дольше, чем синтаксис точки.

Вот небольшой тест скорости, чтобы проиллюстрировать мою точку зрения:

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));

Если бы они были одинаковыми, за исключением обозначений, они должны занимать ровно столько же времени.Но, как вы можете видеть, это не так.На моей машине:

Time with dot syntax:      3937
Time with bracket syntax:  9857
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...