Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
7.3. Разреженные массивы
Разреженным называется массив, индексы элементов которого не образуют непрерывную последовательность чисел, начиная с 0. Обычно свойство length массива определяет количество элементов в массиве. В разреженном массиве значение свойства length больше количества элементов. Разреженный массив можно создать с помощью конструктора Аггау()
или путем присваивания значения элементу с индексом, большим, чем текущая длина массива.
а = new Array(5); // Нет элементов, но a.length имеет значение 5.
а = []; // Создаст пустой массив со значением length = 0.
а[1000] = 0; // Добавит один элемент, но установит длину равной 1001.
Далее будет показано, что разреженный массив можно также создать с помощью оператора delete.
Существенно разреженные массивы обычно более медленны и потребляют больше памяти, чем плотные массивы, а поиск элементов в таких массивах занимает примерно столько же времени, что и поиск обычных свойств объектов.
Обратите внимание, что литералы с пропущенными значениями (когда в определении подряд следуют запятые, например [1, ,3]
) создают разреженные массивы, в которых пропущенные элементы просто не существуют:
var a1 = [,]; // Массив без элементов с длиной, равной 1
var а2 = [undefined]; // Массив с одним неопределенным элементом
О in а1 // => false: а1 не имеет элемента с индексом О
О in а2 // => true: а2 имеет элемент с индексом 0 и со значением undefined
Некоторые старые реализации (такие как Firefox 3) некорректно вставляли элементы со значением undefined
на место пропущенных элементов. В этих реализациях литерал [1,,3]
был эквивалентен литералу [1, undefined,3].
7.4. Длина массива
Любой массив имеет свойство length
, и это свойство отличает массивы от обычных объектов JavaScript. Для плотных (т.е. неразреженных) массивов свойство length
определяет количество элементов в массиве. Его значение на единицу больше самого большого индекса в массиве:
[].length // => 0: массив не имеет элементов
['а','Ь','с'].length // => 3: наибольший индекс равен 2, длина равна 3
Для разреженных массивов значение свойства length больше числа элементов, и все, что можно сказать в этом случае, - это то, что значение свойства length
гарантированно будет превышать индекс любого элемента в массиве. Или, говоря иначе, массивы (разреженные или нет) никогда не будут содержать элемент, индекс которого будет больше или равен значению свойства length массива
. Для поддержки этого свойства массивы проявляют две особенности поведения. Первая была описана выше: если присвоить значение элементу массива, индекс і
которого больше или равен текущему значению свойства length
, в свойство length
записывается значение i+1
.
Вторая особенность в поведении, обеспечивающем работу свойства length
, заключается в том, что при присваивании свойству length
неотрицательного целого числа n, меньшего, чем его текущее значение, все элементы массива с индексами, большими или равными значению n, удаляются из массива:
а = [1,2,3,4,5]; // Создать массив с пятью элементами.
a.length =3; // теперь массив а содержит элементы [1,2,3].
a.length = 0; // Удалит все элементы, а - пустой массив [].
a.length = 5; // Длина равна 5, но элементы отсутствуют, подобно Аггау(5)
В свойство length
массива можно также записать значение больше, чем его текущее значение. В этом случае в массив не добавляются новые элементы, а просто создается разреженная область в конце массива.
В ECMAScript 5 свойство length
массива можно сделать доступным только для чтения, с помощью Object.defineProperty()
(раздел 6.7):
а = [1,2,3]; // Создать массив а с тремя элементами.
Object.defineProperty(a, ‘length", // Сделать свойство length
{writable: false}); // доступным только для чтения,
a.length =0; //а не изменится.
Аналогично, если сделать элемент массива ненастраиваемым, его нельзя будет удалить. Если элемент нельзя будет удалить, то и свойство length
не может быть установлено в значение, меньшее или равное индексу ненастраиваемого элемента. (Смотрите раздел 6.7, а также описание методов Object.seal()
и Object.freeze()
в разделе 6.8.3.)
7.5. Добавление и удаление элементов массива
Мы уже видели, что самый простой способ добавить элементы в массив заключается в том, чтобы присвоить значения новым индексам:
а = [] // Создать пустой массив.
а[0] = "zero"; // И добавить элементы.
а[1] = "one";
Для добавления одного или более элементов в конец массива можно также использовать метод push():
а = []; // Создать пустой массив
a.push("zero") // Добавить значение в конец, а = ["zero"]
a.push("one", "two") // Добавить еще два значения,
а = ["zero", "one", "two"]
Добавить элемент в конец массива можно также, присвоив значение элементу а[а.length]
. Для вставки элемента в начало массива можно использовать метод unshift()
(описывается в разделе 7.8), при этом существующие элементы в массиве смещаются в позиции с более высокими индексами.
Удалять элементы массива можно с помощью оператора delete
, как обычные свойства объектов:
а = [1.2.3];
delete а[1]; // теперь в массиве а отсутствует элемент с индексом 1
1 in а // => false: индекс 1 в массиве не определен
a.length // => 3: оператор delete не изменяет свойство length массива
Удаление элемента напоминает (но несколько отличается) присваивание значения undefined
этому элементу. Обратите внимание, что применение оператора delete
к элементу массива не изменяет значение свойства length
и не сдвигает вниз элементы с более высокими индексами, чтобы заполнить пустоту, оставшуюся после удаления элемента. После удаления элемента массив превращается в разреженный массив.
Кроме того, как уже было показано выше, имеется возможность удалять элементы в конце массива простым присваиванием нового значения свойству length
. Массивы имеют метод рор()
(противоположный методу push()
), который уменьшает длину массива на 1 и возвращает значение удаленного элемента. Также имеется метод shift()
(противоположный методу unshift()
), который удаляет элемент в начале массива. В отличие от оператора delete
, метод shift()
сдвигает все элементы вниз на позицию ниже их текущих индексов. Методы рор()
и shift()
описываются в разделе 7.8 и в справочном разделе.
Интервал:
Закладка: