cpp

Класс Uint8ClampedArray

Класс Uint8ClampedArray описывает типизированный массив, содержащий значения в диапазоне от 0 до 255. Если передается значение меньше минимального, то будет вставлено минимальное значение. Если передано значение больше максимального, то будет вставлено максимальное значение. Это основное отличие от Uint8Array, где происходит усечение значения. Пример:

let arr = new Uint8ClampedArray([1, 2, 0, 255, 256, -1]);
console.log(arr); // Uint8ClampedArray(6) [1, 2, 0, 255, 255, 0]
console.log(Uint8ClampedArray.BYTES_PER_ELEMENT); // 1
console.log(Uint8ClampedArray.name);              // Uint8ClampedArray

Создание объекта

Создать массив позволяют следующие конструкторы:

<Массив> = new Uint8ClampedArray();
<Массив> = new Uint8ClampedArray(<Количество элементов>);
<Массив> = new Uint8ClampedArray(<Типизированный массив>);
<Массив> = new Uint8ClampedArray(<Объект, поддерживающий итерации>);
<Массив> = new Uint8ClampedArray(<ArrayBuffer>[, <byteOffset>[, 
                                 <length>]]);

Первый конструктор создает массив нулевого размера:

let arr = new Uint8ClampedArray();
console.log(arr.length); // 0

Второй конструктор позволяет указать количество элементов. Все элементы получат значение 0:

let arr = new Uint8ClampedArray(5);
console.log(arr); // Uint8ClampedArray(5) [0, 0, 0, 0, 0]

Третий конструктор создает массив на основе другого типизированного массива:

let arr1 = new Uint8ClampedArray([1, 2, 3]);
let arr2 = new Uint8ClampedArray(arr1);
arr2[0] = 0;
console.log(arr1); // Uint8ClampedArray(3) [1, 2, 3]
console.log(arr2); // Uint8ClampedArray(3) [0, 2, 3]

Четвертый конструктор в качестве параметра принимает объект, поддерживающий итерации. Можно указать, например, обычный массив или множество:

let arr1 = new Uint8ClampedArray([1, 2, 3]);
console.log(arr1); // Uint8ClampedArray(3) [1, 2, 3]
let arr2 = new Uint8ClampedArray(new Set([1, 2, 2]));
console.log(arr2); // Uint8ClampedArray(2) [1, 2]

Пятый конструктор создает массив на основе объекта ArrayBuffer:

let buf = new ArrayBuffer(7);
let arr1 = new Uint8ClampedArray(buf);
console.log(arr1);        // Uint8ClampedArray(7) [0, 0, 0, 0, 0, 0, 0]
let arr2 = new Uint8ClampedArray(buf, 3);
console.log(arr2.length); // 4
let arr3 = new Uint8ClampedArray(buf, 3, 2);
console.log(arr3.length); // 2

Обратите внимание: данные не копируются. Два объекта будут ссылаться на один и тот же фрагмент памяти:

let arr1 = new Uint8ClampedArray([1, 2, 3]);
let arr2 = new Uint8ClampedArray(arr1.buffer, arr1.byteOffset,
                                 arr1.byteLength);
arr2[0] = 5;
console.log( arr1 ); // Uint8ClampedArray(3) [5, 2, 3]
console.log( arr2 ); // Uint8ClampedArray(3) [5, 2, 3]

Изменились оба массива!

В этом примере мы воспользовались следующими свойствами:

  • buffer — содержит ссылку на объект ArrayBuffer, лежащий в основе массива;
  • byteOffset — смещение внутри объекта ArrayBuffer;
  • byteLength — длина фрагмента в байтах.

Для создания массива можно также использовать статический метод from():

<Массив> = Uint8ClampedArray.from(<Объект>[, <Функция>[, <this>]]);

В первом параметре указывается объект, поддерживающий итерации:

let arr1 = Uint8ClampedArray.from([1, 2, 3]);
console.log(arr1);        // Uint8ClampedArray(3) [1, 2, 3]
let arr2 = Uint8ClampedArray.from('123');
console.log(arr2);        // Uint8ClampedArray(3) [1, 2, 3]

Во втором параметре можно указать ссылку на функцию, которая будет вызвана для каждого элемента. Функция имеет следующий формат:

function name(value, index, array) {
   return value;
}

Значение, возвращаемое функцией, станет новым значением элемента массива:

let arr = Uint8ClampedArray.from([1, 2, 3], (value) => {
   return value * 2;
});
console.log(arr);        // Uint8ClampedArray(3) [2, 4, 6]

Создать массив на основе списка значений позволяет статический метод of(). Значения указываются через запятую:

let arr = Uint8ClampedArray.of(1, 2, 3);
console.log(arr);        // Uint8ClampedArray(3) [1, 2, 3]

Определение числа элементов массива

Получить количество элементов массива позволяет свойство length:

let arr = Uint8ClampedArray.of(1, 2, 3);
console.log(arr.length); // 3

Размер типизированного массива является фиксированным. Изменить размер после создания объекта нельзя.

Получение и изменение элементов массива

Получить значение элемента массива можно, указав его индекс в квадратных скобках. Нумерация элементов массива начинается с нуля:

let arr = Uint8ClampedArray.of(1, 2, 3);
console.log( arr[0] ); // 1
console.log( arr[1] ); // 2
console.log( arr[2] ); // 3

Если элемент с указанным индексом не существует, то будет возвращено значение undefined:

console.log( arr[3] ); // undefined

При желании можно изменить значение существующего элемента:

arr[0] = 5;
arr[1] = 6;
console.log( arr[0] ); // 5
console.log( arr[1] ); // 6

Если передается значение меньше минимального, то будет вставлено минимальное значение. Если передано значение больше максимального, то будет вставлено максимальное значение:

arr[0] = -1;
arr[1] = 256;
console.log( arr[0] ); // 0
console.log( arr[1] ); // 255

С помощью метода fill() можно заполнить весь массив или только диапазон одинаковым значением. Формат метода:

fill(<Значение>[, <Начало>[, <Конец>]])

В первом параметре указывается вставляемое значение, которое заполнит весь массив или только указанный фрагмент:

let arr = new Uint8ClampedArray(5);
console.log(arr); // Uint8ClampedArray(5) [0, 0, 0, 0, 0]
arr.fill(1);
console.log(arr); // Uint8ClampedArray(5) [1, 1, 1, 1, 1]

В параметре <Начало> можно указать начальный индекс диапазона (значение по умолчанию: 0), а в параметре <Конец> — конечный индекс (значение по умолчанию: число элементов массива). Метод fill() возвращает ссылку на массив, поэтому можно строить цепочки из вызовов:

let arr = new Uint8ClampedArray(5);
arr.fill(1, 1, 4);
console.log(arr); // Uint8ClampedArray(5) [0, 1, 1, 1, 0]

С помощью метода set(<Массив>[, <Смещение>]) можно скопировать данные из обычного массива или типизированного массива:

let arr = new Uint8ClampedArray(5);
arr.set( [1, 2, 3] );
console.log( arr ); // Uint8ClampedArray(5) [1, 2, 3, 0, 0]
arr.set( [4, 5], 3 );
console.log( arr ); // Uint8ClampedArray(5) [1, 2, 3, 4, 5]
arr.set( Uint8ClampedArray.of(6, 7, 8) );
console.log( arr ); // Uint8ClampedArray(5) [6, 7, 8, 4, 5]

Для сохранения значений элементов массива в переменных можно использовать операцию распаковки массива. В этом случае массив указывается справа от оператора =, а переменные внутри квадратных скобок — слева от оператора =:

let arr = Uint8ClampedArray.of(1, 2);
let [a, b] = arr;
console.log( a + ' ' + b );   // 1 2

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

let arr = Uint8ClampedArray.of(1, 2, 3, 4, 5);
let a = 0, b = 0;
[a, , b] = arr;
console.log( a + ' ' + b );   // 1 3

Значения отдельных элементов массива можно сохранить в переменных, а оставшиеся элементы добавить в массив, указав перед ним оператор три точки:

let arr = Uint8ClampedArray.of(1, 2, 3, 4, 5);
let [a, b, ...other] = arr;
console.log( a + ' ' + b );   // 1 2
console.log( other );         // [ 3, 4, 5 ]

Создание копии массива

Следует учитывать, что операция присваивания сохраняет в переменной ссылку на массив, а не все его значения. Например, если попробовать сделать так, то изменение arr2 затронет arr1:

let arr1, arr2;
arr1 = Uint8ClampedArray.of(1, 2, 3, 4);
arr2 = arr1;          // Присваивается ссылка на массив!!!
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [88, 2, 3, 4]
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]

Для создания полной копии можно воспользоваться конструктором класса Uint8ClampedArray или статическим методом from():

let arr1, arr2;
arr1 = Uint8ClampedArray.of(1, 2, 3, 4);
arr2 = new Uint8ClampedArray(arr1);
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [1, 2, 3, 4]
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]
arr2 = Uint8ClampedArray.from(arr1);
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [1, 2, 3, 4]
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]

Скопировать фрагмент позволяет метод slice([<Начало>[, <Конец>]). Если параметры не указаны, то создается полная копия. В первом параметре можно указать начальный индекс, а во втором — конечный индекс (не включая элемент с этим индексом). Если второй параметр не задан, то копируется фрагмент, начиная с индекса <Начало> до конца массива:

let arr1, arr2;
arr1 = Uint8ClampedArray.of(1, 2, 3, 4);
arr2 = arr1.slice();
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [1, 2, 3, 4]
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]
arr2 = arr1.slice(2);
console.log(arr2);    // Uint8ClampedArray(2) [3, 4]
arr2 = arr1.slice(2, 3);
console.log(arr2);    // Uint8ClampedArray [3]

Перебор элементов массива

Для перебора массивов удобно использовать цикл for. Умножим все элементы массива на 2:

let arr = Uint8ClampedArray.of(1, 2, 3);
for (let i = 0; i < arr.length; i++) {
   arr[i] *= 2;
}
console.log(arr); // Uint8ClampedArray(3) [2, 4, 6]

Перебрать элементы массива позволяет также цикл for...of, который на каждой итерации присваивает переменной копию значения элемента массива:

let arr = Uint8ClampedArray.of(1, 2, 3);
for (const value of arr) {
   console.log(value);
}

Можно также воспользоваться методом forEach(). Формат метода:

forEach(<Функция>[, <this>])

В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Значение, указанное в параметре <this>, будет доступно через указатель this внутри функции:

let arr = Uint8ClampedArray.of(1, 2, 3);
arr.forEach( function(value, index, array) {
   array[index] = value * 2;
});
console.log(arr); // Uint8ClampedArray(3) [2, 4, 6]

Методы, возвращающие итераторы

Следующие методы возвращают специальный объект — итератор:

  • keys() — возвращает итератор, содержащий индексы элементов массива:
let arr = Uint8ClampedArray.of(1, 2, 3, 4);
let iterator = arr.keys();
console.log(iterator); // Array Iterator {}
// Перебор всех элементов
for (const key of iterator) {
   console.log(`${key} `);
} // 0 1 2 3
// Преобразование в массив
let arrKeys = [...arr.keys()];
console.log(arrKeys);  // [0, 1, 2, 3]
  • values() — возвращает итератор, содержащий значения элементов массива:
let arr = Uint8ClampedArray.of(5, 6, 7, 8);
let iterator = arr.values();
// Перебор всех элементов
for (const value of iterator) {
   console.log(value);
} // 5 6 7 8
console.log();
// Преобразование в массив
let arrValues = [...arr.values()];
console.log(arrValues);  // [5, 6, 7, 8]
arrValues = [...arr];
console.log(arrValues);  // [5, 6, 7, 8]
  • entries() — возвращает итератор, содержащий пары индекс/значение всех элементов массива:
let arr = Uint8ClampedArray.of(5, 6, 7);
let iterator = arr.entries();
// Перебор всех элементов
for (const [key, value] of iterator) {
   console.log(`${key} => ${value} `);
} // 0 => 5 1 => 6 2 => 7
// Преобразование в массив
let arrEntries = [...arr.entries()];
console.log(arrEntries); // [ [ 0, 5 ], [ 1, 6 ], [ 2, 7 ] ]

Фильтрация массива

Метод filter(<Функция>[, <this>]) позволяет выполнить фильтрацию массива. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Функция должна вернуть значение true, если элемент соответствует условию, и false — в противном случае. Значение, указанное во втором параметре, будет доступно внутри функции через указатель this. Метод возвращает массив элементов, соответствующих условию (для которых функция вернула значение true). Исходный массив не изменяется. Пример:

let arr = Uint8ClampedArray.of(1, 2, 3, 4, 5, 6);
let arr2 = arr.filter( function(value, index, ar) {
   return value < 4;
});
console.log(arr2);     // Uint8ClampedArray(3) [1, 2, 3]

С помощью метода map(<Функция>[, <this>]) можно применить пользовательскую функцию ко всем элементам массива. Внутри функции нужно вернуть новое значение элемента. Метод map() возвращает отфильтрованный массив. Пример умножения всех элементов массива на 2:

let arr = Uint8ClampedArray.of(1, 2, 3, 4, 5, 6);
let arr2 = arr.map( function(value, index, ar) {
   return value * 2;
});
console.log(arr2);     // Uint8ClampedArray(6) [2, 4, 6, 8, 10, 12]

Метод reduce(<Функция>[, <Начальное значение>]) применяет функцию к парам элементов и накапливает результат. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает четыре параметра. Через первый параметр доступен результат предыдущих вычислений или <Начальное значение> при первом вызове, через второй — значение текущего элемента, через третий — его индекс, а через четвертый — ссылка на массив. Внутри функции нужно вернуть результат текущих вычислений. Метод reduce() возвращает общий результат вычислений. Пример получения суммы всех элементов массива:

let arr = Uint8ClampedArray.of(1, 2, 3);
let sum = arr.reduce( function(value1, value2, index, ar) {
   return value1 + value2;
}, 0);
console.log(sum);              // 6

Метод reduceRight() аналогичен методу reduce(), но перебирает элементы не слева направо, а справа налево:

let arr = Uint8ClampedArray.of(1, 2, 3);
let sum = arr.reduceRight( function(value1, value2, index, ar) {
   return value1 + value2;
}, 0);
console.log(sum);              // 6

Переворачивание массива

Метод reverse() переворачивает массив. Элементы будут следовать в обратном порядке относительно исходного массива:

let arr = Uint8ClampedArray.of(1, 2, 3);
arr.reverse();
console.log(arr);               // Uint8ClampedArray(3) [3, 2, 1]

Получение части массива

Метод slice([<Начало>[, <Конец>]]) возвращает срез массива, начиная от индекса <Начало> и заканчивая индексом <Конец>, но не включает элемент с этим индексом. Если первый параметр не указан, то он будет иметь значение 0. Если второй параметр не указан, то возвращаются все элементы до конца массива:

let arr1, arr2;
arr1 = Uint8ClampedArray.of(1, 2, 3, 4);
arr2 = arr1.slice();
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [1, 2, 3, 4]
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]
arr2 = arr1.slice(2);
console.log(arr2);    // Uint8ClampedArray(2) [3, 4]
arr2 = arr1.slice(2, 3);
console.log(arr2);    // Uint8ClampedArray [3]

Вместо метода slice() можно воспользоваться методом subarray([<Начало>[, <Конец>]]):

let arr1, arr2;
arr1 = Uint8ClampedArray.of(1, 2, 3, 4);
arr2 = arr1.subarray();
arr2[0] = 88;
console.log(arr1);    // Uint8ClampedArray(4) [88, 2, 3, 4] !!!
console.log(arr2);    // Uint8ClampedArray(4) [88, 2, 3, 4]
arr2 = arr1.subarray(2);
console.log(arr2);    // Uint8ClampedArray(2) [3, 4]
arr2 = arr1.subarray(2, 3);
console.log(arr2);    // Uint8ClampedArray [3]
Обратите внимание

Сортировка массива

Отсортировать массив позволяет метод sort([Функция сортировки]). Если функция сортировки не указана, будет выполнена обычная сортировка:

let arr = Uint8ClampedArray.of(4, 1, 3, 2);
arr.sort();
console.log(arr); // Uint8ClampedArray(4) [1, 2, 3, 4]

Если нужно изменить стандартный порядок сортировки, это можно сделать с помощью пользовательской функции сортировки. Функция принимает две переменные и должна возвращать:

  • положительное число — если первый элемент больше второго;
  • отрицательное число — если второй элемент больше первого;
  • 0 — если элементы равны.

Отсортируем массив в обратном и прямом порядке:

let arr = Uint8ClampedArray.of(4, 1, 3, 2);
arr.sort( function(a, b) {
   if (a > b) return -1;
   if (a < b) return 1;
   return 0;
});
console.log(arr); // Uint8ClampedArray(4) [4, 3, 2, 1]
arr.sort((a, b) => a - b);
console.log(arr); // Uint8ClampedArray(4) [1, 2, 3, 4]

Проверка наличия значения в массиве

Выполнить поиск элемента в массиве позволяют следующие методы:

  • indexOf(<Элемент>[, <Индекс>]) — ищет первое вхождение элемента в массиве. Возвращает индекс найденного элемента или значение -1, если элемент не найден. Во втором параметре можно указать индекс, с которого начнется поиск. Если второй параметр не указан, то поиск начинается с начала массива:
let arr = Uint8ClampedArray.of(1, 2, 1, 2, 3);
console.log( arr.indexOf(2) );        // 1
console.log( arr.indexOf(2, 2) );     // 3
console.log( arr.indexOf(3) );        // 4
console.log( arr.indexOf(8) );        // -1
  • lastIndexOf(<Элемент>[, <Индекс>]) — ищет последнее вхождение элемента в массиве:
let arr = Uint8ClampedArray.of(1, 2, 1, 2, 3);
console.log( arr.lastIndexOf(2) );    // 3
console.log( arr.lastIndexOf(2, 2) ); // 1
console.log( arr.lastIndexOf(3) );    // 4
console.log( arr.lastIndexOf(8) );    // -1
  • includes(<Элемент>[, <Индекс>]) — возвращает значение true, если элемент присутствует в массиве, и false — в противном случае. Во втором параметре можно указать индекс элемента с которого начнется поиск. Пример:
let arr = Uint8ClampedArray.of(1, 2, 3);
console.log( arr.includes(1) );    // true
console.log( arr.includes(1, 1) ); // false
console.log( arr.includes(4) );    // false
  • every(<Функция>[, <this>]) — возвращает значение true, если все элементы массива соответствуют заданному условию, и false — в противном случае. В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента массива. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его индекс, а через третий — ссылка на массив. Функция должна вернуть значение true, если элемент соответствует условию, и false — в противном случае. Если функция для всех элементов вернула true, то метод every() также возвращает значение true. Если функция вернет значение false, то проверка прекращается и метод every() возвращает значение false. Значение, указанное во втором параметре, будет доступно внутри функции через указатель this. Пример проверки:
function test(value, index, ar) {
   return value > 1;
}
let arr = Uint8ClampedArray.of(2, 3),
    arr2 = Uint8ClampedArray.of(1, 2, 0);
console.log( arr.every(test) );    // true
console.log( arr2.every(test) );   // false
  • some(<Функция>[, <this>]) — возвращает значение true, если хотя бы один элемент массива соответствует заданному условию, и false — в противном случае. Если функция вернет значение true, то проверка прекращается и метод some() возвращает значение true. Если функция для всех элементов вернула false, то метод some() также возвращает значение false. Пример:
function test(value, index, ar) {
   return value < 1;
}
let arr = Uint8ClampedArray.of(2, 3),
    arr2 = Uint8ClampedArray.of(1, 2, 0);
console.log( arr.some(test) );    // false
console.log( arr2.some(test) );   // true
  • find(<Функция>[, <this>]) — возвращает значение первого элемента, для которого функция вернула true, или значение undefined, если функция для всех элементов вернула false. Пример:
function test(value, index, ar) {
   return value < 1;
}
let arr = Uint8ClampedArray.of(2, 3),
    arr2 = Uint8ClampedArray.of(1, 2, 0);
console.log( arr.find(test) );    // undefined
console.log( arr2.find(test) );   // 0
  • findIndex(<Функция>[, <this>]) — возвращает индекс первого элемента, для которого функция вернула true, или значение -1, если функция для всех элементов вернула false. Пример:
function test(value, index, ar) {
   return value < 1;
}
let arr = Uint8ClampedArray.of(2, 3),
    arr2 = Uint8ClampedArray.of(1, 2, 0);
console.log( arr.findIndex(test) );    // -1
console.log( arr2.findIndex(test) );   // 2

Преобразование массива в строку или другой объект

Преобразовать массив в строку позволяют следующие методы:

  • join([<Разделитель>]) — возвращает строку, полученную в результате объединения всех элементов массива через разделитель:
let arr = Uint8ClampedArray.of(1, 2, 3);
let str = arr.join(' - ');
console.log(str); // 1 - 2 - 3

Если параметр не указан, то в качестве символа-разделителя будет использоваться запятая:

let arr = Uint8ClampedArray.of(1, 2, 3);
let str = arr.join();
console.log(str); // 1,2,3
  • toString() — преобразует массив в строку. Элементы перечисляются через запятую без пробела. Метод вызывается автоматически при использовании строкового контекста. Пример:
let arr = Uint8ClampedArray.of(1, 2, 3);
console.log( arr.toString() ); // 1,2,3
console.log(arr + '');         // 1,2,3
  • toLocaleString() — преобразует массив в строку. Элементы указываются через запятую без пробела:
let arr = Uint8ClampedArray.of(1, 2, 3);
console.log( arr.toLocaleString() ); // 1,2,3

Для преобразования типизированного массива в обычный массив можно воспользоваться оператором SPREAD:

let arr = Uint8ClampedArray.of(1, 2, 3);
let arr2 = [...arr];
console.log(arr2); // [1, 2, 3]

Чтобы преобразовать типизированный массив в объект Buffer, следует воспользоваться статическим методом from():

let arr = new Uint8ClampedArray( [116, 101, 115, 116] );
let buf = Buffer.from(arr);
buf[0] = 108;
buf[1] = 105;
console.log( buf ); // Buffer(4) [108, 105, 115, 116]
console.log( arr ); // Uint8ClampedArray(4) [116, 101, 115, 116]

Для преобразования объекта Buffer в типизированный массив достаточно передать объект конструктору типизированного массива:

let buf = Buffer.from( [1, 2, 3] );
let arr = new Uint8ClampedArray(buf);
console.log(arr); // Uint8ClampedArray(3) [ 1, 2, 3 ]
arr[0] = 55;
console.log(arr); // Uint8ClampedArray(3) [ 55, 2, 3 ]
console.log(buf); // Buffer(3) [1, 2, 3]

Если нужно, чтобы типизированный массив ссылался на ту же самую область памяти, то следует воспользоваться свойствами buffer и byteOffset:

let buf = Buffer.from( [1, 2, 3] );
let arr = new Uint8ClampedArray(buf.buffer, buf.byteOffset,
                   buf.length / Uint8ClampedArray.BYTES_PER_ELEMENT);
console.log(arr); // Uint8ClampedArray(3) [ 1, 2, 3 ]
arr[0] = 55;
console.log(arr); // Uint8ClampedArray(3) [ 55, 2, 3 ]
console.log(buf); // Buffer(3) [55, 2, 3]

Пример использования метода from():

let arr = new Uint8ClampedArray( [116, 101, 115, 116] );
let buf = Buffer.from(arr.buffer);
buf[0] = 55;
console.log( buf ); // Buffer(4) [55, 101, 115, 116]
                    // Данные изменились !!!
console.log( arr ); // Uint8ClampedArray(4) [55, 101, 115, 116]

Учебник по Electron js
Учебник Electron js в формате PDF

Реквизиты

ЮMoney: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp