Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JS: Добавляет плейсхолдеры для недостающих коллекций #4839

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions js/array-buffer/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
---
title: "`ArrayBuffer`"
description: "Объект с бинарными данными фиксированной длины."
authors:
- doka-dog
keywords:
- typed array
- indexed collection
- javascript collection
related:
- js/shared-array-buffer
- js/typed-array
- js/data-view
tags:
- doka
- placeholder
---

## Кратко

Объект с сырыми данными фиксированного размера, который представляет собой кусочек памяти. Работать напрямую с данными из объекта нельзя, однако можно создавать отображения этих данных и манипулировать содержимым `ArrayBuffer` через них.

Типизированные массивы – отображения содержимого `ArrayBuffer`. Они упрощают работу с тяжёлыми данными, например, видео, аудио и анимациями. Их часто используют с различными API — WebGL, Canvas 2D, XMLHttpRequest2 и так далее.

## Пример

```js
const buffer = new ArrayBuffer(3)
const view = new Int8Array(buffer)

console.log(view)
// Int8Array(3) [0, 0, 0, buffer: ArrayBuffer(3),
// byteLength: 3, byteOffset: 0, length: 3,
// Symbol(Symbol.toStringTag): 'Int8Array']
```

## Как пишется

Элементами из `ArrayBuffer` нельзя манипулировать без представления. По сути это просто ссылка на часть памяти, в которой хранятся сырые данные.

Всегда используйте оператор `new` для создания `ArrayBuffer`. Первый аргумент конструктора объекта `ArrayBuffer` определяет количество байт, которое нужно выделить для хранения данных.

```js
new ArrayBuffer(8)
```

Представление можно создать при помощи объектов `TypedArray` или [`DataView`](/js/data-view/). Они позволяют читать и записывать данные из буфера в нужном формате.

```js
const buffer = new ArrayBuffer(1)
const asUInt = new Uint8Array(buffer)
const asInt = new Int8Array(buffer)

asInt[0] = 1
console.log(asUInt[0])
// 1

asInt[0] = -1
console.log(asUInt[0])
// 255
```

В этом примере создали два отображения для одного и того же буфера данных — знаковый и беззнаковый `Int`. Записывая `-1`, мы получаем следующие бинарные данные: 0b11111111. Это соответствует значению 255.

`ArrayBuffer` можно открепить от соответствующей ему области памяти, в отличие от [`SharedArrayBuffer`](/js/shared-array-buffer/). Чаще всего это нужно при передаче объекта между потоками. `ArrayBuffer`, переданный в новый поток, становится откреплённым в старом потоке. Из него больше нельзя читать данные.

### Свойства

- `length` — длина `ArrayBuffer` в байтах. По умолчанию равна 1.
- `byteLength` — размер `ArrayBuffer` в байтах, если для буфера используется метод `ArrayBuffer.prototype.resize()`.
- `maxByteLength` — максимальный размер `ArrayBuffer` в байтах, до которого может быть увеличен буфер.
- `resizable` — можно ли изменять размер буфера. Возвращает `true` или `false`.
- `detached` — был ли отсоединён новый массив от старого. Возвращает `true` или `false`.

### Методы

- `.isView()` — возвращает представление буфера. Это может быть `true` или `false`.
- `.resize()` — увеличивает размер `ArrayBuffer` в байтах до указанного числа.
- `.slice()` — возвращает новый `ArrayBuffer`, который содержит копию старого.
- `.transfer()` — возвращает новый `ArrayBuffer`, который в том числе содержит данные из старого.
- `.transferToFixedLength()` — создаёт новый `ArrayBuffer` с неизменяемым размером и отсоединяет его от старого.

## Как понять

Буфер — пространство в памяти, где хранятся бинарные данные. Про память подробнее узнаете из статьи «[Как устроена память](/tools/trivial-memory-model/)».
62 changes: 62 additions & 0 deletions js/data-view/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: "`DataView`"
description: "Объект для представления бинарных данных из буфера в нужном порядке байтов."
authors:
- doka-dog
keywords:
- typed array
- indexed collection
- javascript collection
- typed array view
related:
- js/typed-array
- js/shared-array-buffer
- js/array-buffer
tags:
- doka
- placeholder
---

## Кратко

Объект, который предоставляет низкоуровневое API (Application Programming Interface, интерфейс программирования приложения) для записи и чтения данных из [`ArrayBuffer`](/js/array-buffer/) или [`SharedArrayBuffer`](/js/shared-array-buffer/). Является частью типизированного массива.

Типизированные массивы упрощают работу с тяжёлыми данными, например, видео, аудио и анимациями. Их часто используют с различными API — WebGL, Canvas 2D, XMLHttpRequest2 и так далее.

## Пример

```js
const littleEndian = (() => {
const buffer = new ArrayBuffer(2)
new DataView(buffer).setInt16(0, 256, true)

return new Int16Array(buffer)[0] === 256
})()

console.log(littleEndian)
// true или false
```

## Как пишется

`DataView`, как и `TypedArray`, используют для представления данных из `ArrayBuffer`. Этот объект позволяет контролировать порядок байтов, который может не совпадать с их порядком в операционной системе пользователя. К примеру, через `DataView` можно установить порядок от младшего к старшему (little-endian) или смешанный (middle-endian).

Чтобы создать `DataView`, обязательно используйте оператор `new`. Обратите внимание, что значение `DataView` нельзя изменять. Оно устанавливается один раз при создании объекта.

### Свойства

- `buffer` — на какой `ArrayBuffer` ссылается представление. Только для чтения.
- `byteLength` — размер представления в байтах. Только для чтения.
- `byteOffset` — смещение представления в байтах от начального значения в `ArrayBuffer`. Только для чтения.

### Методы

В качестве методов используют разные числовые форматы. Методы `get()` читают данные из нужного буфера, а `set()` их записывают. Например, `.getInt8()`, `.getUnit8()`, `.setFloat64()`, `.setBigInt64()`.

[Список всех методов `DataView`](https://tc39.es/ecma262/multipage/structured-data.html#sec-dataview.prototype.constructor).

## Как понять

_Порядок байтов (endianness)_ — последовательность байтов, в которой информация хранится в памяти компьютера. По умолчанию используется порядок от старшего к младшему (big-endian).

Про память подробнее узнаете из статьи «[Как устроена память](/tools/trivial-memory-model/)».
5 changes: 5 additions & 0 deletions js/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,13 @@ groups:
items:
- object
- arrays
- typed-array
- data-view
- array-buffer
- shared-array-buffer
- function-as-datatype
- set
- weak-set
- map
- collection-weakmap
- name: "Числа"
Expand Down
60 changes: 60 additions & 0 deletions js/shared-array-buffer/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
title: "`SharedArrayBuffer`"
description: "Объект с бинарными данными фиксированной длины для разделяемой области памяти."
authors:
- doka-dog
keywords:
- typed array
- indexed collection
- javascript collection
related:
- js/arrays
- js/typed-array
- js/data-view
tags:
- doka
- placeholder
---

## Кратко

Объект, который содержит буфер фиксированной длины с бинарными данными. Используется для доступа к разделяемой памяти и не может быть откреплён от неё, в отличие от [`ArrayBuffer`](/js/array-buffer/). Является частью типизированного массива [`TypedArray`](/js/typed-array/).

Типизированные массивы упрощают работу с тяжёлыми данными, например, видео, аудио и анимациями. Их часто используют с различными API — WebGL, Canvas 2D, XMLHttpRequest2 и так далее.

## Пример

```js
const sab = new SharedArrayBuffer(1024)
worker.postMessage(sab)
```

## Как пишется

Всегда используйте оператор `new` для создания `SharedArrayBuffer`. В скобках указывают размер буфера в байтах. В качестве второго значения можно указать дополнительные свойства. Например, максимальный размер, до которого может увеличиться `SharedArrayBuffer`.

```js
const buffer = new SharedArrayBuffer(8, { maxByteLength: 16 })

buffer.grow(12)
```

Так как `SharedArrayBuffer` может работать сразу с несколькими тредами в памяти, его используют для Service Worker. В этом случае `SharedArrayBuffer` используют вместе с методом `postMessage()`и алгоритмами структурированного клонирования.

Из-за рисков, связанных с информационной безопасностью, к `SharedArrayBuffer` не всегда стоит предоставлять глобальный доступ. Чтобы максимально обезопасить данные на сайте или в приложении, не забывайте про CORS (Cross-origin Resource Sharing, совместное использование ресурсов между разными источниками).

### Свойства

- `byteLength` — размер буфера в байтах.
- `constructor` — создаёт экземпляр объекта.
- `growable` — увеличивается или нет длина буфера. Возвращает `true` или `false`.
- `maxByteLength` — максимальный размер, до которого может увеличиться `SharedArrayBuffer`.

### Методы

- `.grow()` — расширяет размеры объекта `SharedArrayBuffer` в байтах до установленного значения.
- `.slice()` — возвращает копию `SharedArrayBuffer` с таким же количеством байтов, как оригинальный объект.

## Как понять

Буфер — пространство в памяти, где хранятся бинарные данные. _Разделяемая память (shared memory)_ означает, что для чтения и записи информации из буфера обращаются не к ядру, а к отдельным сегментам памяти. Про память подробнее узнаете из статьи «[Как устроена память](/tools/trivial-memory-model/)».
58 changes: 58 additions & 0 deletions js/typed-array/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
title: "`TypedArray`"
description: "Объект для представления бинарных данных из буфера."
authors:
- doka-dog
keywords:
- typed array
- indexed collection
- javascript collection
- typed array view
related:
- js/shared-array-buffer
- js/array-buffer
- js/data-view
tags:
- doka
- placeholder
---

## Кратко

Типизированный массив, в котором содержатся байты. Хотя на первый взгляд `TypedArray` напоминает обычный массив, на самом деле это полноценный объект. С его помощью получаем доступ к двоичным данным из буфера — пространства в памяти, где хранятся бинарные данные. Обычно они находятся в оперативной памяти (Random Access Memory или коротко RAM).

<aside>

🧠 Про память подробнее узнаете из статьи «[Как устроена память](/tools/trivial-memory-model/)».

</aside>

Типизированные массивы `TypedArray` упрощают работу с тяжёлыми данными, например, видео, аудио и анимациями. Их часто используют с различными API — WebGL, Canvas 2D, XMLHttpRequest2 и так далее.

## Пример

```js
let view = new Int8Array(3)

view[0] = 1
view[2] = 6

console.log(view)
// Int8Array(3) [1, 0, 6, buffer: ArrayBuffer(3),
// byteLength: 3, byteOffset: 0, length: 3,
// Symbol(Symbol.toStringTag): 'Int8Array']
```

## Как пишется

Типизированные массивы состоят из буферов и представлений. В буфере содержатся данные, а представление помогает получить доступ к данным из буфера и представить их в виде типизированного массива.

Чтобы создать типизированный массив, сначала создайте буфер с помощью [объекта `ArrayBuffer`](/js/array-buffer/) или [`SharedArrayBuffer`](/js/shared-array-buffer/), а потом его представление объектами `TypedArray` или [`DataView`](/js/data-view/).

Для создания `ArrayBuffer` используйте оператор `new`. В `TypedArray` указывают нужный размер данных, количество элементов и их начальную позицию в буфере. Для этого используют разные [числовые форматы](https://tc39.es/ecma262/multipage/indexed-collections.html#table-the-typedarray-constructors). Например, `Int8Array`, `Uint8Array`, `Float64Array`, `Uint8ClampedArray`.

Можно использовать одновременно несколько представлений `TypedArray` для одного и того же буфера.

## Как понять

_Коллекция в JavaScript_ — это набор данных разного типа. К примеру, в ней могут хранится массивы и объекты. Также коллекция может быть сама по себе специфической структурой данных, если в ней намешано много всего. Они бывают нескольких видов, и `TypedArray` относится к проиндексированным коллекциям.
41 changes: 41 additions & 0 deletions js/weak-set/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
title: "`WeakSet`"
description: "Коллекция, в которой временно хранятся уникальные объекты."
authors:
- doka-dog
keywords:
- keyed collection
- javascript collection
related:
- js/collection-weakmap
- js/map
- js/set
tags:
- doka
- placeholder
---

## Кратко

Коллекция из пар ключ-значение, которая временно хранит объекты и/или символы. Все элементы уникальные и могут быть добавлены в такую коллекцию один раз. Как и [`WeakMap`](/js/collection-weakmap/), `WeakSet` нужна для сборщика мусора.

## Пример

```js
var ws = new WeakSet()
var obj = {}
var foo = {}

ws.add(window)
ws.add(obj)

ws.has(window); // true
ws.has(foo); // false, foo не добавлен в WeakSet

ws.delete(window) // удаляет window из WeakSet
ws.has(window) // false, window был удалён
```

## Как понять

_Коллекция в JavaScript_ — это набор данных разного типа. К примеру, в ней могут хранится массивы и объекты. Также коллекция может быть сама по себе специфической структурой данных, если в ней намешано много всего. Они бывают нескольких видов, и `WeakSet` относится к ключевым коллекциям.
Loading