Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

for(var і = 0; і < bytes.length; і++) // Для каждого элемента массива

bytes[i] = і & 0xFF; // Записать 8 младших бит индекса

var copy = new Uint8Array(bytes); // Создать копию массива

var ints = new Int32Array([0,1,2,3]); // Типизированный массив с 4 целыми

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

// Возвращает наибольшее целое простое число меньше п.

// Использует алгоритм "Решето Эратосфена"

function sieve(n) {

var а = new Int8Array(n+1); // в a[x] записывается 1, если х - составное число

var max = Math.floor(Math.sqrt(n));// Множитель не может быть выше этого значения

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ег
. Каждый типизированный массив имеет три свойства, связывающие его с лежащим в его основе буфером:

  • Читать дальше
  • 1
  • ...
  • 447
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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