Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разница между "obj['s']" = и "obj.s =" (http://www.flasher.ru/forum/showthread.php?t=159067)

Welcometo 26.06.2011 23:12

Разница между "obj['s']" = и "obj.s ="
 
Есть ли разница в том, как указывать свойства объектам (динамически).
Так
Код:

var worker:Object = {};
worker["age"] = 15;

или так
Код:

worker.age = 15;
А так же есть ли разница в том как инициализировать новую переменную типа Object: так - var o:Object = new Object() , или так - var o:Object = {}; ?

КорДум 26.06.2011 23:20

Разница только в скорости доступа-создания.

udaaff 26.06.2011 23:27

Цитата:

Есть ли разница в том, как указывать свойства объектам (динамически).
Первый вариант использую только там, где нельзя использовать второй.
Цитата:

А так же есть ли разница в том как инициализировать новую переменную типа Object: так - var o:Object = new Object() , или так - var o:Object = {}; ?
Рекомендуется второй вариант.

serogah 26.06.2011 23:29

Привет!
var o:Object = new Object() идентично var o:Object = {}. Скорость создания - одинаковая.
worker["age"] = 15 идентично worker.age = 15. Скорость доступа - одинаковая.
Только есть отличие: при помощи квадратных скобок можна формировать свойство на "лету". Например:
worker["age"+8] = 15, что эквивалентно worker.age8 = 15. Но если написать: worker.age+8 = 15 - будет ошибка

КорДум 26.06.2011 23:30

Цитата:

Первый вариант использую только там, где нельзя использовать второй.
Это ты, например, про
Код AS3:

private function setMyProp(prop:String, value:*):void {
    _obj[prop] = value;
}

?

Добавлено через 54 секунды
Цитата:

Скорость создания - одинаковая
Скорость доступа - одинаковая..
Неправда.

serogah 26.06.2011 23:34

Цитата:

Неправда.
Почему неправда? Я проверял.

Добавлено через 2 минуты
Код AS3:

import flash.utils.getTimer;
 
var time:uint=getTimer();
var obj:Object={};
trace(getTimer()-time) //0

Код AS3:

import flash.utils.getTimer;
 
var time:uint=getTimer();
var obj:Object=new Object();
trace(getTimer()-time) //0

В 1 и 2 варианте - результат "0"

Welcometo 26.06.2011 23:38

Спасибо за ответы.
serogah, привет)
worker["age"+8] = 15, что эквивалентно worker.age8 = 15.
Вот это очень интересная вещь) Не знал)Часто необходимо бывает динамически создавать объекты(неопределенное количество), и в таком случае для доступа к ним приходится пихать их в коллекцию, а оттуда их уже по индексу выдергивать. А тут, грубо говоря, можно будет динамически каждому объекту раздавать id:
Код:

for (i;i<n;i++){worker["age"+i]}
. А потом обращаться worker.age1, worker.age2 и тд

dimarik 26.06.2011 23:39

на миллионе итераций проверьте

КорДум 26.06.2011 23:40

Код AS3:

private function onTimer():void {
        var num:uint = 1000000;
        var time:int;
        var obj:Object;
 
        time = getTimer();
        var i:int;
        for (i = 0; i < num; i++) {
                obj = { };
        }
        trace(getTimer() - time);
 
        time = getTimer();
        for (i = 0; i < num; i++) {
                obj = new Object();
        }
        trace(getTimer() - time);
 
        var objProps:Object = { };
 
        time = getTimer();
        for (i = 0; i < num; i++) {
                objProps.myProp = 50;
        }
        trace(getTimer() - time);
 
        time = getTimer();
        for (i = 0; i < num; i++) {
                objProps["myProp"] = 50;
        }
        trace(getTimer() - time);
}

Потому что проверять нужно не на одном.
Трейсы выдали: 1000, 621, 242, 362 соответственно.

serogah 26.06.2011 23:43

Цитата:

на миллионе итераций проверьте
. Да, верно, скорости разные. Но разница все равно небольшая.

Welcometo 26.06.2011 23:47

Цитата:

Трейсы выдали: 1000, 621, 242, 362 соответственно.
То есть new Object почти вдвое быстрее чем {} ?
А почему тогда рекомендуется использовать {}, как писал udaaff.

wvxvw 27.06.2011 00:03

Смысл не в скорости, т.как по скорости нужно оптимизировать, когда это критично. Смысл в том, что когда вы компилируете X.Y - компилятор проверит, и выдаст ошибку, если у объекта X нет свойства Y. А когда вы X[Y] - это называется reflection - т.е. вы используете возможность среды выполнения найти по заданному строковому ключу свойство объекта. Естесственно, это будет не надежно (т.как вы можете сделать ошибку в имени свойства, т.как кто-то может после компиляции переиначить таблицу символов - место в котором среда выполнения будет искать соответствие ключа и свойства), ну и понятное дело, будет медленнее, т.как, даже не смотря на то, что флешевый компилятор - не оптимизирующий, при создании имен во время компиляции он может использовать более или менее жесткие правила. Менее жесткие правила требуют впоследствие от среды выполнения больше работы для нахождения свойства.

S-ed 27.06.2011 01:45

Код AS3:

obj["2011"] = 50;
obj.2011 = 50; //ну, тут Вы, думаю, поняли...


goodguy 27.06.2011 07:20

Цитата:

Сообщение от wvxvw (Сообщение 1006736)
Смысл не в скорости, т.как по скорости нужно оптимизировать, когда это критично. Смысл в том, что когда вы компилируете X.Y - компилятор проверит, и выдаст ошибку, если у объекта X нет свойства Y. А когда вы X[Y] - это называется reflection - т.е. вы используете возможность среды выполнения найти по заданному строковому ключу свойство объекта. Естесственно, это будет не надежно (т.как вы можете сделать ошибку в имени свойства, т.как кто-то может после компиляции переиначить таблицу символов - место в котором среда выполнения будет искать соответствие ключа и свойства), ну и понятное дело, будет медленнее, т.как, даже не смотря на то, что флешевый компилятор - не оптимизирующий, при создании имен во время компиляции он может использовать более или менее жесткие правила. Менее жесткие правила требуют впоследствие от среды выполнения больше работы для нахождения свойства.

Странно. У меня компилятор не выдает никаких ошибок, даже если я пытаюсь ему подсунуть свойство, отсутствующее в объекте. И если попытаться оттрейсить такое свойство, просто выдаст null, и не более.

gloomyBrain 27.06.2011 11:23

Цитата:

просто выдаст null, и не более
Вы чем компилируете? Если свойство не существует, значит оно undefined, а не null
Код AS3:

var o:Object = { };
trace(o.a);    // undefined
trace(o["a"]); // undefined


goodguy 27.06.2011 11:26

gloomyBrain, да, undefined, просто сказал по памяти. Но суть не в этом, суть в том, что ошибок не выдает на этапе компилирования. Только при попытке дальнейшего обращения к этому свойству.

wvxvw 27.06.2011 11:41

Ну так это вообще разные вещи... есть доступ к элементам массива или хеш, а есть обращение к свойствам. Когда вы обращаетесь к строковому хешу то, скорее всего, происходит следующее (так это происходит в других языках, как именно это происходит в AS3 - я не знаю, но вряд ли отличается):
Используя простой алгоритм хеширования из строкового ключа создается числовой индекс (обычно 0..2^16) и в массив по этому индексу заносится ссылка на объект, который есть значение пары ключ-значение.
Когда вы используете синтаксис с точкой, то компилятор может быть уверен, что у него есть полная строка, и он может элементарно заменить ее на переход по индексу. Когда вы используете квадратные скобки, то у компилятора такой уверенности быть не может, и он оставит процедуру создания индекса рантайму. Естесственно, что второй вариант будет дольше. Но, опять же, это не доступ к свойству, они просто одинаково записываются в AS3, но свойства - это квалифицированые имена, и они не обязаны вообще привязываться к каким-то строкам, в то время как строковой хеш, естесствено, обязан использовать строки.

alatar 27.06.2011 12:06

Цитата:

Сообщение от goodguy (Сообщение 1006787)
Но суть не в этом, суть в том, что ошибок не выдает на этапе компилирования. Только при попытке дальнейшего обращения к этому свойству.

Потому что объект динамический.

etc 27.06.2011 18:26

Цитата:

Сообщение от udaaff (Сообщение 1006718)
Рекомендуется второй вариант.

Здесь нужно дописать ещё то, что это рекомедуется только в том случае, когда вы этих объектов миллион в секунду создаёте.

S-ed 28.06.2011 02:06

Цитата:

Здесь нужно дописать ещё то, что это рекомедуется только в том случае, когда вы этих объектов миллион в секунду создаёте.
Цитата дня. =)))

TanaTiX 28.06.2011 10:43

Цитата:

Здесь нужно дописать ещё то, что это рекомендуется только в том случае, когда вы этих объектов миллион в секунду создаёте.
А можно немного расшифровать? Как так получается, что поведение зависит от количества итераций?

etc 28.06.2011 18:18

Цитата:

Сообщение от TanaTiX (Сообщение 1007020)
А можно немного расшифровать? Как так получается, что поведение зависит от количества итераций?

Никак оно не зависит, просто краткая запись уместна в критически важном по быстродействию коде. В остальных случаях — new Object().

Crazy 28.06.2011 18:27

Цитата:

Сообщение от etc (Сообщение 1007111)
Никак оно не зависит, просто краткая запись уместна в критически важном по быстродействию коде. В остальных случаях — new Object().

Стандартный стайлгайд рекомендует использовать "{}" безо всяких "в остальных случаях". Есть какие-то причины поступать иначе кроме "а я уже везде так понаписал"?

udaaff 28.06.2011 18:28

Цитата:

просто краткая запись уместна в критически важном по быстродействию коде
А чего в стальных случаях "краткая запись" не уместна?

etc 28.06.2011 18:35

Цитата:

Сообщение от Crazy (Сообщение 1007113)
Стандартный стайлгайд рекомендует использовать "{}" безо всяких "в остальных случаях". Есть какие-то причины поступать иначе кроме "а я уже везде так понаписал"?

Банально — для создания экземпляра чего-либо мы пользуемся соответствующим оператором. Делать исключения для массива и объекта оправдано по указанным ранее причинам.
Мы работаем с ООП.

Crazy 28.06.2011 18:38

Цитата:

Сообщение от etc (Сообщение 1007117)
Банально — для создания экземпляра чего-либо мы пользуемся соответствующим оператором. Делать исключения для массива и объекта оправдано по указанным ранее причинам.

Понятно, вопрос Вы не прочитали или не поняли.

Спрошу проще. Вы предлагаете нарушить стайлгайд. Зачем?

P.S. Нет нужды объяснять, что такое стайлгайд и зачем его соблюдать?

etc 28.06.2011 18:46

Цитата:

Сообщение от Crazy (Сообщение 1007119)
Понятно, вопрос Вы не прочитали или не поняли.

Спрошу проще. Вы предлагаете нарушить стайлгайд. Зачем?

P.S. Нет нужды объяснять, что такое стайлгайд и зачем его соблюдать?

Нужды нет, просто лично я не считаю в отличие от вас адобовский стайлгайд незыблемой библией. Я не считаю хорошим тоном создавать объекты разным способом, если в этом нет реальной необходимости.
И это не единственный спорный пункт из этого гайдлайна (который, кстати, конкретно предназначен для писанины под Flex).
Вы можете не иметь собственного мнения и юзать этот гайдлайн, как хотите.

Psycho Tiger 28.06.2011 18:50

Я всегда пишу {} и []. Это более краткая запись, что удобно и мне не нравится перспектива писать то [], то new Array, размышляя, критический этот участок или нет. Я за единообразие.

etc 28.06.2011 18:52

Цитата:

Сообщение от Psycho Tiger (Сообщение 1007124)
Я за единообразие.

О каком единообразии идёт речь, если у тебя в коде «[]» и «new Something()» кругом?

gloomyBrain 28.06.2011 18:54

Цитата:

Я за единообразие
Это уже пахнет холиваром, но не могу удержаться - Тигра большинство объектов ты создаешь литералами? я думаю, что нет =) так что это явно не единообразие

udaaff 28.06.2011 18:55

В коде еще есть цифры и строки, и живут же без new как-то. Если есть литерал, то пользуемся литералом.

gloomyBrain 28.06.2011 18:59

Цифры и строки не предполагают конструктора, ибо они - значения.

Crazy 28.06.2011 18:59

Цитата:

Сообщение от etc (Сообщение 1007122)
Нужды нет, просто лично я не считаю в отличие от вас адобовский стайлгайд незыблемой библией. Я не считаю хорошим тоном создавать объекты разным способом, если в этом нет реальной необходимости.

Вы, собственно, как раз и предлагаете выполнять одну операцию -- создание экземпляра класса Object -- двумя разными способами. Это много хуже, чем разрешить себе выполнять создание уникального объекта особого рода особым способом. Тем более, что в язык специально для этого добавлена соответствующая языковая конструкция.

Цитата:

И это не единственный спорный пункт из этого гайдлайна
А что, в природе есть гайдлайны, которые всех во всем устраивают? Никогда о таком не слышал.

Цитата:

который, кстати, конкретно предназначен для писанины под Flex
Это что-то меняет? (мне, кстати, понравилось выбранное Вами слово. Типа "эти плебеи... со своей писаниной на Flex... ах, как это ужасно, герцогиня!")

Цитата:

Вы можете не иметь собственного мнения и юзать этот гайдлайн, как хотите.
20 лет работы в команде дали мне понимание того, что худой мир лучше доброй ссоры. Я не стану, простите, срать коллегам на голову только потому, что у меня по поводу некоторой синтаксической конструкции есть свое особое мнение.

Разумеется, следовать своему примеру не заставляю. Со временем само придет. Может быть.

Добавлено через 1 минуту
Цитата:

Сообщение от gloomyBrain (Сообщение 1007131)
Цифры и строки не предполагают конструктора, ибо они - значения.

Они, как точно выразился udaaff, ЛИТЕРАЛЫ. Как и "{}". В Java, к примеру, числа вполне себе имеют конструкторы. :)

incoob 28.06.2011 19:06

Код AS3:

new Number(5);
new String("qq");

Цифры и строки? Конструкторы?

gloomyBrain 28.06.2011 19:09

Цитата:

В Java, к примеру, числа вполне себе имеют конструкторы
В Java, к примеру, есть int и есть Integer, и это разные вещи. Первое - значение, второе - обертка над значением.

etc 28.06.2011 19:12

Цитата:

Сообщение от Crazy (Сообщение 1007132)
Вы, собственно, как раз и предлагаете выполнять одну операцию -- создание экземпляра класса Object -- двумя разными способами. Это много хуже, чем разрешить себе выполнять создание уникального объекта особого рода особым способом. Тем более, что в язык специально для этого добавлена соответствующая языковая конструкция.

Я не считаю Object уникальным объектом, чтобы ради него использовать иную конструкцию для создания. Тем не менее, я допускаю его использование там, где читаемость кода стоит на втором месте после скорости. И только. Литералы при таком использовании однозначно дают понять, что перед нами критически важный участок, а не *****код.

з. Ы. Я надеюсь, вы также переносите открывающую фигурную скобку, по конвенции Адоби.

alatar 28.06.2011 19:18

Цитата:

Сообщение от gloomyBrain (Сообщение 1007137)
В Java, к примеру, есть int и есть Integer, и это разные вещи. Первое - значение, второе - обертка над значением.

Java и AS3, все таки, две большие разницы. В AS3 и числа и строки это объекты (хоть и специальные), со своими методами. Вполне можно написать.
Код AS3:

5.toString();


etc 28.06.2011 19:20

Цитата:

Сообщение от alatar (Сообщение 1007141)
Java и AS3, все таки, две большие разницы. В AS3 и числа и строки это объекты (хоть и специальные), со своими методами. Вполне можно написать.
Код AS3:

5.toString();


Да и в Java можно, приведя к соответствующему типу.

alatar 28.06.2011 19:20

Цитата:

з. Ы. Я надеюсь, вы также переносите открывающую фигурную скобку, по конвенции Адоби.
Холивар внутри холивара?

Crazy 28.06.2011 19:20

Цитата:

Сообщение от gloomyBrain (Сообщение 1007137)
В Java, к примеру, есть int и есть Integer, и это разные вещи. Первое - значение, второе - обертка над значением.

Коллега, Вы несколько неортодоксально трактуете термин "значение". В Java и то, и другое -- значение. Но значения примитивного и объектного типов. Кстати, 10 -- это вовсе не значение примитивного типа. Это литерал, который интересен только компилятору. Для проверки можете посмотреть, какой байткод формируется для этой конструкции:

Код:

Integer foo = 10;


Часовой пояс GMT +4, время: 11:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.