Показать сообщение отдельно
Старый 16.09.2002, 18:18
AnGL вне форума Посмотреть профиль Отправить личное сообщение для AnGL Найти все сообщения от AnGL
  № 72  
AnGL
 
Аватар для AnGL

Регистрация: Jul 2002
Адрес: Ст.-Петербург
Сообщений: 268
Как я понял, мы говорим не о чтении текстового файла swf, а о работе интерпретатора...

Рассмотрим приведенный код:

Код:
(1)
a[1]="xxx";
trace(a["1"]);

и наоборот 

(2)
a["1"]="xxx";
trace(a[1]);
Поясняю:
Код 1:
В данном случае Используется индексная адресация(!).
Байткод:

setVariable
push 'a'
getVariable
push 1, 'xxx'

Выполнение команды trace производится с конвертацией строкового типа в индекс массива(на уровне интерпретатора).

Код 2:
Компилятор байткода записывает единицу как строку "1".
Байткод:

setVariable
push 'a'
getVariable
push '1', 'xxx'

Интерпретатор, получая такую строку скорее всего конвертирует ее в индекс (по крайней мере я бы именно так писал интерпретатор).

Далее рассуждаем...
Если мы пишем:

Код:
a = new Object();
a["a"] = "xxx";
Байткод:

constants 'a', 'Object', 'xxx'
push 'a', 0.0, 'Object'
new
setVariable
push 'a'
getVariable
push 'a', 'xxx'
setMember

А если мы запишем так:
Код:
a = new Array();
a["a"] = "xxx";
Байткод:

constants 'a', 'Array', 'xxx'
push 'a', 0.0, 'Array'
new
setVariable
push 'a'
getVariable
push 'a', 'xxx'
setMember

По моему ясно, что в обоих случаях мы получаем объект с именем "a" и свойством "a", хотя во втором случае мы имеем доступ еще и к свойствам массива, так как(естественно) Array - есть экземпляр от Object, и любой потомок Array наследует его свойства и методы (такие как length и т.п)...

Все... По моему достаточно рассуждений.

С уважением...