Книга: JavaScript. Подробное руководство, 6-е издание

7.2. Чтение и запись элементов массива

7.2. Чтение и запись элементов массива

Доступ к элементам массива осуществляется с помощью оператора [ ]. Слева от скобок должна присутствовать ссылка на массив. Внутри скобок должно находиться произвольное выражение, возвращающее неотрицательное целое значение. Этот синтаксис пригоден как для чтения, так и для записи значения элемента массива. Следовательно, допустимы все приведенные далее JavaScript-инструкции:

var а = ["world"]; // Создать массив с одним элементом
var value = а[0]; // Прочитать элемент 0
а[1] = 3.14; // Записать значение в элемент 1
і = 2;
а[і] = 3; // Записать значение в элемент 2
а[і + 1] = "hello"; // Записать значение в элемент 3
а[а[і]] = а[0]; // Прочитать элементы 0 и 2, записать значение в элемент 3

Напомню, что массивы являются специализированной разновидностью объектов. Квадратные скобки, используемые для доступа к элементам массива, действуют точно так же, как квадратные скобки, используемые для доступа к свойствам объекта. Интерпретатор JavaScript преобразует указанные в скобках числовые индексы в строки - индекс 1 превращается в строку "1" , - а затем использует строки как имена свойств. В преобразовании числовых индексов в строки нет ничего особенного: то же самое можно проделывать с обычными объектами:

о = {}; // Создать простой объект
о[1] = "one"; // Индексировать его целыми числами

Особенность массивов состоит в том, что при использовании имен свойств, которые являются неотрицательными целыми числами, не превышающими 232-2, массивы автоматически определяют значение свойства length. Например, выше был создан массив а с единственным элементом. Затем были присвоены значения его элементам с индексами 1, 2 и 3. В результате этих операций значение свойства length массива изменилось:

a.length // => 4

Следует четко отличать индексы в массиве от имен свойств объектов. Все индексы являются именами свойств, но только свойства с именами, представленными целыми числами в диапазоне от 0 до 232-2 являются индексами. Все массивы являются объектами, и вы можете добавлять к ним свойства с любыми именами. Однако если вы затрагиваете свойства, которые являются индексами массива, массивы реагируют на это, обновляя значение свойства length при необходимости.

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

а[-1.23] = true; // Будет создано свойство с именем "-1.23"
а["1000"] = 0; // 1001-й элемент массива
а[1.000] // Элемент с индексом 1. То же. что и а[1]

То обстоятельство, что индексы массива являются всего лишь особой разновидностью имен свойств объекта, означает, что для массивов JavaScript отсутствует понятие ошибки «выхода за границы». Попытка получить значение любого несуществующего свойства любого объекта не рассматривается как ошибка, в этом случае просто возвращается значение undefined. То же относится и к массивам:

а = [true, false]; // Этот массив имеет элементы с индексами 0 и 1
а[2] // => undefined. Нет элемента с таким индексом.
а[-1] // => undefined. Нет свойства с таким именем.

Поскольку массивы фактически являются объектами, они могут наследовать элементы от своих прототипов. В ECMAScript 5 массивы могут даже иметь элементы, определяющие методы чтения и записи (раздел 6.6). Если массив наследует элементы или элементы в нем имеют методы доступа, доступ к такому массиву не оптимизируется интерпретатором: время доступа к элементам такого массива будет сопоставимо с временем поиска обычных свойств объекта.

Оглавление книги


Генерация: 1.418. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз