Чтение онлайн

на главную - закладки

Жанры

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

var р = 2; // 2 - первое простое число

while(p <= max) { // Для простых чисел меньше max

for(var і = 2*р; і <= n; і += p) // Пометить числа, кратные р,

a[i] = 1; // как составные

while(a[++p]) /* пустое тело */; // Следующий непомеченный индекс -

} // простое число

while(a[n]) n--; // Цикл в обр. напр., чтобы отыскать последнее простое

return n; // И вернуть его

}

Функция

sieve
будет работать, если вызов конструктора
Int8Array
заменить вызовом традиционного конструктора
Аггау
, но выполняться она будет в два-три раза дольше и будет расходовать гораздо больше памяти при больших значениях параметра n. Типизированные массивы могут также пригодиться при обработке графических изображений и для математических вычислений:

var matrix = new Float64Array(9); // Матрица 3x3

var 3dPoint = new Int16Array(3); // Точка в 3-мерном пространстве

var rgba = new Uint8Array(4); // 4-байтовое значение RGBA пиксела

var sudoku = new Uint8Array(81); // Доска 9x9 для игры в судоку

Форма записи с квадратными скобками, используемая в языке JavaScript, позволяет читать и записывать значения отдельных элементов типизированного массива. Но типизированные массивы определяют дополнительные методы для записи и чтения целого фрагмента массива. Метод

set
копирует элементы обычного или типизированного массива в типизированный массив:

var bytes = new Uint8Aгray(1024) // Буфер размером 1Кбайт

var pattern = new Uint8Array([0,1,2,3]); // Массив из 4 байтов

bytes.set(pattern); // Скопировать их в начало другого массива байтов

bytes.set(pattern, 4); // Скопировать их же в другое место массива

bytes.set([0,1,2,3], 8); // Просто скопировать значения из обычного массива

Типизированные массивы имеют также метод

subarray,
возвращающий фрагмент массива, относительно которого он был вызван:

var ints = new Int16Array([0,1.2,3.4,5,6,7,8,9]); // 10 коротких целых

var last3 = ints.subarray(ints.length-3, ints.length); // Последние 3 из них

last3[0] // => 7: то же самое, что и ints[7]

Обратите внимание, что метод

subarray
не создает копии данных. Он просто возвращает новое представление тех же самых значений:

ints[9] = -1; // Изменить значение в оригинальном массиве и...

last3[2] // => -1: изменения коснулись фрагмента массива

Тот факт, что метод

subarray
возвращает новое представление существующего массива, раскрывает важную особенность типизированных массивов: все они являются представлениями участка памяти, который называется
ArrayBuffег
. Каждый типизированный массив имеет три свойства, связывающие его с лежащим в его основе буфером:

last3.buffer // => вернет объект ArrayBuffer

last3.buffer == ints.buffer // => true: оба - представления одного буфера

last3.byteOffset // => 14: это представление начинается с 14-го байта в буфере

last3.byteLength // => 6: размер представления 6 байт (3 16-битных целых)

Сам объект

ArrayBuffer
имеет только одно свойство, возвращающее его длину:

last3.byteLength // => 6: размер представления 6 байт

last3.buffer.byteLength // => 20: но буфер имеет размер 20 байт

Типизированные массивы, элемент <canvas> и базовый JavaScript

Типизированные массивы являются важной частью прикладного интерфейса создания трехмерной графики WebGL в элементе <canvas>, и в броузерах они реализованы как часть прикладного интерфейса WebGL. WebGL не рассматривается в этой книге, но типизированные массивы весьма полезны сами по себе, и поэтому обсуждаются здесь. В главе 21 говорилось, что прикладной интерфейс объекта Canvas определяет метод getlmageData, возвращающий объект ImageData. Свойство data объекта ImageData является массивом байтов. В спецификации HTML он называется CanvasPixelArray, но, по сути, это то же самое, что описываемый здесь Uint8Array, за исключением способа обработки значений, выходящих за диапазон 0-255.

Имейте в виду, что эти типы не являются частью базового языка. Будущие версии языка JavaScript, возможно, будут включать поддержку типизированных массивов, подобных этим, но на момент написания этих строк еще было неясно, примет ли язык прикладной интерфейс, описываемый здесь, или будет создан новый прикладной интерфейс.

*****************************************************

Объект

АгrayВuffers
– это всего лишь последовательность байтов. К этим байтам можно обращаться с помощью типизированных массивов, но сам объект
ArrayBuffer
не является типизированным массивом. Однако будьте внимательны: объект
ArrayBuffer
можно индексировать числами, как любой другой объект JavaScript, но это не обеспечивает доступ к байтам в буфере:

var bytes = new Uint8Array(8); // Разместить 8 байтов

bytes[0] =1; // Записать в первый байт значение 1

bytes.buffer[0] // => undefined: буфер не имеет индекса 0

bytes.buffer[1] = 255; // Попробовать некорректно записать значение в байт буфера

bytes.buffer[1] // => 255: это обычное JavaScript-свойство

Поделиться:
Популярные книги

На границе империй. Том 10. Часть 7

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 7

Фантом памяти

Маринина Александра
2. Преступления правильной жизни
Детективы:
прочие детективы
8.43
рейтинг книги
Фантом памяти

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Товарищ "Чума" 7

lanpirot
7. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 7

Целого Мира Мало

Джиллиан Алекс
Любовные романы:
современные любовные романы
8.88
рейтинг книги
Целого Мира Мало

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV