Skip to content

Commit 4483c85

Browse files
authored
Update article.md
1 parent 31d9781 commit 4483c85

File tree

1 file changed

+38
-38
lines changed

1 file changed

+38
-38
lines changed

4-binary/01-arraybuffer-binary-arrays/article.md

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
En el desarrollo web nos encontramos con datos binarios sobre todo al tratar con archivos (crear, cargar, descargar). Otro caso de uso típico es el procesamiento de imágenes.
44

5-
Todo esto es posible en JavaScript, y las operaciones binarias son de alto rendimiento.
5+
Todo esto es posible en JavaScript y las operaciones binarias son de alto rendimiento.
66

7-
Aunque, hay un poco de confusión, porque hay muchas clases. Por nombrar algunas:
7+
Aunque hay un poco de confusión porque hay muchas clases. Por nombrar algunas:
88

99
- `ArrayBuffer`, `Uint8Array`, `DataView`, `Blob`, `File`, etc.
1010

@@ -37,18 +37,18 @@ Un objeto vista no almacena nada por sí mismo. Son las "gafas" las que dan una
3737

3838
Por ejemplo:
3939

40-
- **`Uint8Array`** -- trata cada byte del `ArrayBuffer` como un número separado, con valores posibles de 0 a 255 (un byte es de 8 bits, por lo que sólo puede contener esa cantidad). Este valor se denomina "entero sin signo de 8 bits".
41-
- **`Uint16Array`** -- trata cada 2 bytes como un entero, con valores posibles de 0 a 65535. Es lo que se llama un "entero sin signo de 16 bits".
42-
- **`Uint32Array`** -- trata cada 4 bytes como un entero, con valores posibles de 0 a 4294967295. Eso se llama "entero sin signo de 32 bits".
43-
- **`Float64Array`** -- trata cada 8 bytes como un número de punto flotante con valores posibles desde <code>5.0x10<sup>-324</sup></code> hasta <code>1.8x10<sup>308</sup></code>.
40+
- **`Uint8Array`** : trata cada byte del `ArrayBuffer` como un número separado, con valores posibles de 0 a 255 (un byte es de 8 bits, por lo que sólo puede contener esa cantidad). Este valor se denomina "entero sin signo de 8 bits".
41+
- **`Uint16Array`** : trata cada 2 bytes como un entero, con valores posibles de 0 a 65535. Es lo que se llama un "entero sin signo de 16 bits".
42+
- **`Uint32Array`** : trata cada 4 bytes como un entero, con valores posibles de 0 a 4294967295. Eso se llama "entero sin signo de 32 bits".
43+
- **`Float64Array`** : trata cada 8 bytes como un número de punto flotante con valores posibles desde <code>5.0x10<sup>-324</sup></code> hasta <code>1.8x10<sup>308</sup></code>.
4444

4545
Así, los datos binarios de un `ArrayBuffer` de 16 bytes pueden interpretarse como 16 "números diminutos", u 8 números más grandes (2 bytes cada uno), o 4 aún más grandes (4 bytes cada uno), o 2 valores de punto flotante con alta precisión (8 bytes cada uno).
4646

4747
![](arraybuffer-views.svg)
4848

4949
`ArrayBuffer` es el objeto central, la raíz de todo, los datos binarios en bruto.
5050

51-
Pero si vamos a escribir en él, o a iterar sobre él, básicamente para casi cualquier operación, debemos utilizar una vista, por ejemplo:
51+
Pero si vamos a escribir en él o a iterar sobre él básicamente para casi cualquier operación, debemos utilizar una vista, por ejemplo:
5252

5353
```js run
5454
let buffer = new ArrayBuffer(16); // crea un búfer de longitud 16
@@ -76,13 +76,13 @@ for(let num of view) {
7676

7777
El término común para todas estas vistas (`Uint8Array`, `Uint32Array`, etc) es [TypedArray](https://tc39.github.io/ecma262/#sec-typedarray-objects). Comparten el mismo conjunto de métodos y propiedades.
7878

79-
Por favor, ten en cuenta que no hay ningún constructor llamado `TypedArray`, es sólo un término "paraguas" común para representar una de las vistas sobre `ArrayBuffer`: `Int8Array`, `Uint8Array` y así sucesivamente, la lista completa seguirá pronto.
79+
Por favor ten en cuenta que no hay ningún constructor llamado `TypedArray`, es sólo un término "paraguas" común para representar una de las vistas sobre `ArrayBuffer`: `Int8Array`, `Uint8Array` y así sucesivamente, la lista completa seguirá pronto.
8080

8181
Cuando veas algo como `new TypedArray`, significa cualquiera de `new Int8Array`, `new Uint8Array`, etc.
8282

8383
Las matrices tipificadas se comportan como las matrices normales: tienen índices y son iterables.
8484

85-
Un constructor de array tipado (ya sea `Int8Array` o `Float64Array`, no importa) se comporta de forma diferente dependiendo del tipo de argumento.
85+
Un constructor de array tipado (ya sea `Int8Array` o `Float64Array`) se comporta de forma diferente dependiendo del tipo de argumento.
8686

8787
Hay 5 variantes de argumentos:
8888

@@ -98,7 +98,7 @@ new TypedArray();
9898

9999
Opcionalmente podemos proporcionar `byteOffset` para empezar (0 por defecto) y la `length` (hasta el final del buffer por defecto), entonces la vista cubrirá sólo una parte del `buffer`.
100100

101-
2. Si se da un `Array`, o cualquier objeto tipo array, se crea un array tipado de la misma longitud y se copia el contenido.
101+
2. Si se da un `Array` o cualquier objeto tipo array se crea un array tipado de la misma longitud y se copia el contenido.
102102

103103
Podemos usarlo para pre-llenar el array con los datos:
104104

@@ -110,8 +110,8 @@ new TypedArray();
110110
alert( arr[1] ); // 1, rellenado con 4 bytes (enteros de 8 bits sin signo) con valores dados
111111
```
112112

113-
3. Si se suministra otro `TypedArray`, hace lo mismo: crea un array tipado de la misma longitud y copia los valores. Los valores se convierten al nuevo tipo en el proceso, si es necesario.
114-
4.
113+
3. Si se suministra otro `TypedArray` hace lo mismo: crea un array tipado de la misma longitud y copia los valores. Los valores se convierten al nuevo tipo en el proceso, si es necesario.
114+
115115
```js run
116116
let arr16 = new Uint16Array([1, 1000]);
117117
*!*
@@ -121,7 +121,7 @@ new TypedArray();
121121
alert( arr8[1] ); // 232, trató de copiar 1000, pero no puede encajar 1000 en 8 bits (explicaciones a continuación)
122122
```
123123

124-
4. Para un argumento numérico `length` -- crea el array tipado para contener ese número de elementos. Su longitud en bytes será `length` multiplicada por el número de bytes de un solo elemento.
124+
4. Para un argumento numérico `length` : crea el array tipado para contener ese número de elementos. Su longitud en bytes será `length` multiplicada por el número de bytes de un solo elemento.
125125

126126
`TypedArray.BYTES_PER_ELEMENT`:
127127
```js run
@@ -130,15 +130,15 @@ new TypedArray();
130130
alert( arr.byteLength ); // 8 (tamaño en bytes)
131131
```
132132

133-
5. Sin argumentos, crea un array tipado de longitud cero.
133+
5. Sin argumentos crea un array tipado de longitud cero.
134134

135-
Podemos crear un `TypedArray` directamente, sin mencionar `ArrayBuffer`. Pero una vista no puede existir sin un `ArrayBuffer` subyacente, por lo que se crea automáticamente en todos estos casos excepto en el primero (cuando se proporciona).
135+
Podemos crear un `TypedArray` directamente sin mencionar `ArrayBuffer`. Pero una vista no puede existir sin un `ArrayBuffer` subyacente, por lo que se crea automáticamente en todos estos casos excepto en el primero (cuando se proporciona).
136136

137137
Para acceder al `ArrayBuffer`, hay propiedades:
138-
- `arr.buffer` -- hace referencia al `ArrayBuffer`.
139-
- `arr.byteLength` -- la longitud del `ArrayBuffer`.
138+
- `arr.buffer` : hace referencia al `ArrayBuffer`.
139+
- `arr.byteLength` : la longitud del `ArrayBuffer`.
140140

141-
Así, siempre podemos pasar de una vista a otra:
141+
De esta forma siempre podemos pasar de una vista a otra:
142142

143143
```js
144144
let arr8 = new Uint8Array([0, 1, 2, 3]);
@@ -149,32 +149,32 @@ let arr16 = new Uint16Array(arr8.buffer);
149149

150150
Esta es la lista de arrays tipados:
151151

152-
- `Uint8Array`, `Uint16Array`, `Uint32Array` -- para números enteros de 8, 16 y 32 bits.
153-
- `Uint8ClampedArray` -- para números enteros de 8 bits, los "sujeta" en la asignación (ver más abajo).
154-
- `Int8Array`, `Int16Array`, `Int32Array` -- para números enteros con signo (pueden ser negativos).
155-
- `Float32Array`, `Float64Array` -- para números de punto flotante con signo de 32 y 64 bits.
152+
- `Uint8Array`, `Uint16Array`, `Uint32Array` : para números enteros de 8, 16 y 32 bits.
153+
- `Uint8ClampedArray` : para números enteros de 8 bits, los "sujeta" en la asignación (ver más abajo).
154+
- `Int8Array`, `Int16Array`, `Int32Array` : para números enteros con signo (pueden ser negativos).
155+
- `Float32Array`, `Float64Array` : para números de punto flotante con signo de 32 y 64 bits.
156156

157157
```
158158
warn header="No `int8` or similar single-valued types"
159159
```
160160
161-
Ten en cuenta que, a pesar de los nombres como `Int8Array`, no hay ningún tipo de valor único como `int` o `int8` en JavaScript.
161+
Ten en cuenta que a pesar de los nombres como `Int8Array`, no hay ningún tipo de valor único como `int` o `int8` en JavaScript.
162162
163-
Esto es lógico, ya que `Int8Array` no es un array de estos valores individuales, sino una vista sobre `ArrayBuffer`.
163+
Esto es lógico ya que `Int8Array` no es un array de estos valores individuales sino una vista sobre `ArrayBuffer`.
164164
165165
### Comportamiento fuera de los límites
166166
167167
¿Qué pasa si intentamos escribir un valor fuera de límites en un array tipado? No habrá ningún error. Pero los bits extra se cortan.
168168
169-
Por ejemplo, intentemos poner 256 en `Uint8Array`. En forma binaria, 256 es `100000000` (9 bits), pero `Uint8Array` sólo proporciona 8 bits por valor, lo que hace que el rango disponible sea de 0 a 255.
169+
Por ejemplo, intentemos poner 256 en `Uint8Array`. En forma binaria 256 es `100000000` (9 bits), pero `Uint8Array` sólo proporciona 8 bits por valor, lo que hace que el rango disponible sea de 0 a 255.
170170
171171
Para los números más grandes, sólo se almacenan los 8 bits más a la derecha (menos significativos), y el resto se corta:
172172
173173
![](8bit-integer-256.svg)
174174
175175
Así que obtendremos un cero.
176176
177-
Para el 257, la forma binaria es `100000001` (9 bits), los 8 más a la derecha se almacenan, por lo que tendremos `1` en el array:
177+
Para el 257 la forma binaria es `100000001` (9 bits), los 8 más a la derecha se almacenan, por lo que tendremos `1` en el array:
178178
179179
![](8bit-integer-257.svg)
180180
@@ -195,7 +195,7 @@ alert(uint8array[0]); // 0
195195
alert(uint8array[1]); // 1
196196
```
197197

198-
`Uint8ClampedArray` es especial en este aspecto, su comportamiento es diferente. Guarda 255 para cualquier número que sea mayor que 255, y 0 para cualquier número negativo. Este comportamiento es útil para el procesamiento de imágenes.
198+
`Uint8ClampedArray` es especial en este aspecto y su comportamiento es diferente. Guarda 255 para cualquier número que sea mayor que 255, y 0 para cualquier número negativo. Este comportamiento es útil para el procesamiento de imágenes.
199199

200200
## Métodos TypedArray
201201

@@ -205,13 +205,13 @@ Podemos iterar, `map`, `slice`, `find`, `reduce` etc.
205205

206206
Sin embargo, hay algunas cosas que no podemos hacer:
207207

208-
- No hay `splice` -- no podemos "borrar" un valor, porque los arrays tipados son vistas en un buffer, y estos son áreas fijas y contiguas de memoria. Todo lo que podemos hacer es asignar un cero.
208+
- No hay `splice` : no podemos "borrar" un valor, porque los arrays tipados son vistas en un buffer y estos son áreas fijas y contiguas de memoria. Todo lo que podemos hacer es asignar un cero.
209209
- No hay método `concat`.
210210

211211
Hay dos métodos adicionales:
212212

213213
- `arr.set(fromArr, [offset])` copia todos los elementos de `fromArr` al `arr`, empezando en la posición `offset` (0 por defecto).
214-
- `arr.subarray([begin, end])` crea una nueva vista del mismo tipo desde `begin` hasta `end` (exclusivo). Es similar al método `slice` (que también está soportado), pero no copia nada -- sólo crea una nueva vista, para operar sobre el trozo de datos dado.
214+
- `arr.subarray([begin, end])` crea una nueva vista del mismo tipo desde `begin` hasta `end` (exclusivo). Es similar al método `slice` (que también está soportado), pero no copia nada sólo crea una nueva vista, para operar sobre el trozo de datos dado.
215215

216216
Estos métodos nos permiten copiar arrays tipados, mezclarlos, crear nuevos arrays a partir de los existentes, etc.
217217

@@ -228,9 +228,9 @@ La sintaxis:
228228
new DataView(buffer, [byteOffset], [byteLength])
229229
```
230230

231-
- **`buffer`** -- el `ArrayBuffer` subyacente. A diferencia de los arrays tipados, `DataView` no crea un buffer por sí mismo. Necesitamos tenerlo preparado.
232-
- **`byteOffset`** -- la posición inicial en bytes de la vista (por defecto 0).
233-
- **`byteLength`** -- la longitud en bytes de la vista (por defecto hasta el final del `buffer`).
231+
- **`buffer`** : el `ArrayBuffer` subyacente. A diferencia de los arrays tipados, `DataView` no crea un buffer por sí mismo. Necesitamos tenerlo preparado.
232+
- **`byteOffset`** : la posición inicial en bytes de la vista (por defecto 0).
233+
- **`byteLength`** : la longitud en bytes de la vista (por defecto hasta el final del `buffer`).
234234

235235
Por ejemplo, aquí extraemos números en diferentes formatos del mismo buffer:
236236

@@ -261,19 +261,19 @@ dataView.setUint32(0, 0); // poner a cero el número de 4 bytes, poniendo así t
261261
Para hacer casi cualquier operación sobre `ArrayBuffer`, necesitamos una vista.
262262

263263
- Puede ser un `TypedArray`:
264-
- `Uint8Array`, `Uint16Array`, `Uint32Array` -- para enteros sin signo de 8, 16 y 32 bits.
265-
- `Uint8ClampedArray` -- para enteros de 8 bits, los "sujeta" en la asignación.
266-
- `Int8Array`, `Int16Array`, `Int32Array` -- para números enteros con signo (pueden ser negativos).
267-
- `Float32Array`, `Float64Array` -- para números de punto flotante con signo de 32 y 64 bits.
268-
- O una `DataView` -- la vista que utiliza métodos para especificar un formato, por ejemplo `getUint8(offset)`.
264+
- `Uint8Array`, `Uint16Array`, `Uint32Array` : para enteros sin signo de 8, 16 y 32 bits.
265+
- `Uint8ClampedArray` : para enteros de 8 bits, los "sujeta" en la asignación.
266+
- `Int8Array`, `Int16Array`, `Int32Array` : para números enteros con signo (pueden ser negativos).
267+
- `Float32Array`, `Float64Array` : para números de punto flotante con signo de 32 y 64 bits.
268+
- O una `DataView` : la vista que utiliza métodos para especificar un formato, por ejemplo `getUint8(offset)`.
269269

270270
En la mayoría de los casos creamos y operamos directamente sobre arrays tipados, dejando el `ArrayBuffer` a cubierto, como "denominador común". Podemos acceder a él como `.buffer` y hacer otra vista si es necesario.
271271

272272
También hay dos términos adicionales, que se utilizan en las descripciones de los métodos que operan con datos binarios:
273273
- `ArrayBufferView` es un término paraguas para todos estos tipos de vistas.
274274
- El término `BufferSource` es un término general para `ArrayBuffer` o `ArrayBufferView`.
275275

276-
Veremos estos términos en los próximos capítulos. El término `BufferSource` es uno de los más comunes, ya que significa "cualquier tipo de datos binarios" -- un `ArrayBuffer` o una vista sobre él.
276+
Veremos estos términos en los próximos capítulos. El término `BufferSource` es uno de los más comunes, ya que significa "cualquier tipo de datos binarios" : un `ArrayBuffer` o una vista sobre él.
277277

278278
Aquí tienes la hoja de ruta:
279279

0 commit comments

Comments
 (0)