Поскольку другие нашли время, чтобы найти очень хорошие объяснения, я вместо этого попытаюсь ответить на вопросы, которые вы задаете неявно:
На данный момент, я думаю, что mySoundArray[0]
будет ссылаться на тот же объект, что и myAmbientSound
Но myAmbiendSound
ни на что не ссылается. Из вашего кода:
var myAmbientSound:Sound;
Выше просто создает локальную переменную типа Sound, потенциальную ссылку. «Палец», который может указывать на что-то, с точки зрения неспециалистов. Все локальные переменные являются ссылками. И, кстати, не все ссылки являются локальными переменными, свойства объектов также являются ссылками, как и элементы Array
и Vector
. В любом случае, приведенное выше выражение не создает объект класса Sound
. Он просто объявляет локальную переменную, которая может ссылаться на объект класса Sound
. При объявлении он имеет специальное значение undefined
.
Существует разница между объявлением переменной, как указано выше, и присвоением ей значения. Оператор new
создает объект и возвращает ссылку на него. Оператор присваивания, =
, приводит к тому, что все, что находится на левой стороне, независимо от того, что находится на правой стороне, грубо говоря.
Один из способов получить указанную выше локальную переменную для объекта:
myAmbientSound = new Sound();
Однако в вашем случае, как я уже сказал, переменная myAmbientSound
имеет специальное значение undefined
, поскольку вы просто объявили его, и ему еще не было присвоено значение. Кроме того, как видно из кода, он не ссылается ни на что в течение всего времени выполнения вашего фрагмента кода.
Теперь, прежде чем я объясню, что вы в итоге добавляете в свой массив с помощью строки:
var mySoundArray:Array = [ myAmbientSound, ...
, вы должны помнить, что элементы массива, так же как и свойства объекта, тоже являются ссылками - например, mySoundArray[0]
может ссылаться на объект, как mySoundArray[1]
и т. Д.
Строка кода выше объявляет новую локальную переменную , а делает ее ссылкой на новый объект массива. Декларация и определение в одном заявлении.
Теперь, поскольку мы установили, что ваша локальная переменная myAmbiendSound
содержит специальное значение undefined
, ваш первый элемент массива в итоге ссылается на это же значение - undefined
, , первоначально . Позже в цикле у вас будет первый элемент (или, если мы хотим быть хитрым, элемент с номером, на который ссылается переменная i
), ссылающийся на новый объект Sound
. В этот момент (и для всей области действия вашего фрагмента, как мы наблюдали), поскольку myAmbiendSound
равно undefined
, сравнение двух по равенству не удастся - они не ссылаются ни на тот же объект, ни на считаются ли объекты, на которые они ссылаются, «равными» (как работает =
в AS3 - другая тема) - первая - undefined
, а вторая указывает на Sound
объект.
Также незначительное исправление: «доступ» к объекту не приводит к исключению во время выполнения. Попытка получить доступ к свойству (используя синтаксис с точечной нотацией) ссылки, которая не указывает на объект - приводит к исключению во время выполнения. Это как если бы вы написали trace(null.foo)
- null
не является объектом и, конечно, не имеет свойства с именем foo
. То же самое касается undefined
.
Кстати, null == undefined
- это true
, но null === undefined
- это false
. Просто говорю. В редких случаях (в зависимости, конечно), вам придется соблюдать эту деталь.
Надеюсь, это прояснит ситуацию. Я считаю это дополнением ко всему сказанному ранее здесь.