You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/03-string/1-ucfirst/solution.md
+2-3Lines changed: 2 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -1,12 +1,12 @@
1
-
No podemos "reemplazar" el primer caracter, debido a que los strings en JavaScript son inmutables.
1
+
No podemos "reemplazar" el primer carácter, debido a que los strings en JavaScript son inmutables.
2
2
3
3
Pero podemos hacer un nuevo string basado en el existente, con el primer carácter en mayúsculas:
4
4
5
5
```js
6
6
let newStr = str[0].toUpperCase() +str.slice(1);
7
7
```
8
8
9
-
Sin embargo, hay un pequeño problema. Si `str` está vacío, entonces `str[0]`no está definido, por lo que obtendremos un error.
9
+
Sin embargo, hay un pequeño problema. Si `str` está vacío, entonces `str[0]` es `undefined`, y como `undefined` no tiene el método `toUpperCase()`, obtendremos un error.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/03-string/3-truncate/task.md
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ importance: 5
4
4
5
5
# Truncar el texto
6
6
7
-
Crea una función `truncate(str, maxlength)` que verifique la longitud de `str` y, si excede `maxlength` - reemplaza el final de `str` con el carácter de puntos suspensivos `"..."`, para hacer su longitud igual a `maxlength`.
7
+
Crea una función `truncate(str, maxlength)` que verifique la longitud de `str` y, si excede `maxlength` - reemplaza el final de `str` con el carácter de puntos suspensivos `"…"`, para hacer su longitud igual a `maxlength`.
8
8
9
9
El resultado de la función debe ser la cadena truncada (si es necesario).
Copy file name to clipboardExpand all lines: 1-js/05-data-types/03-string/article.md
+36-31Lines changed: 36 additions & 31 deletions
Original file line number
Diff line number
Diff line change
@@ -52,15 +52,15 @@ Los backticks además nos permiten especificar una "función de plantilla" antes
52
52
53
53
## Caracteres especiales
54
54
55
-
Es posible crear strings de múltiples líneas usando comillas simples, usando un llamado "caracter de nueva línea", escrito como `\n`, lo que denota un salto de línea:
55
+
Es posible crear strings de múltiples líneas usando comillas simples, usando un llamado "carácter de nueva línea", escrito como `\n`, lo que denota un salto de línea:
56
56
57
57
```js run
58
58
let guestList ='Invitados:\n * Juan\n * Pedro\n * Maria';
59
59
60
60
alert(guestList); // una lista de invitados en múltiples líneas
61
61
```
62
62
63
-
Por ejemplo, estas dos líneas describen lo mismo:
63
+
Por ejemplo, estas dos líneas son iguales, solo que escritas en forma diferente:
64
64
65
65
```js run
66
66
alert('Hola\nMundo'); // dos líneas usando el "símbolo de nueva línea"
@@ -70,7 +70,9 @@ alert(`Hola
70
70
Mundo`);
71
71
```
72
72
73
-
Existen otros tipos de caracteres especiales, menos comunes. Aquí está la lista:
73
+
Existen otros tipos de caracteres especiales, menos comunes.
Notar que el caracter de escape `\` sirve para la correcta lectura del string por JavaScript, luego desaparece. El string que quedó en la memoria no incluye `\`. Lo puedes ver claramente en el `alert` del ejemplo anterior.
112
114
113
-
¿Pero qué pasa si necesitamos incluir un caracter de escape `\` en el string?
115
+
¿Pero qué pasa si necesitamos incluir un carácter de escape `\` en el string?
114
116
115
117
Es posible, pero debemos duplicarlo como sigue `\\`:
116
118
@@ -125,18 +127,19 @@ La propiedad 'length' entrega el largo del string:
125
127
```js run
126
128
alert(`Mi\n`.length); // 3
127
129
```
130
+
128
131
Notar que `\n` es un caracter "especial" único, por lo que el largo es `3`.
129
132
130
-
```warn header="`length` es una característica"
131
-
Gente con experiencia en otros lenguajes a veces comete errores de tipeo al llamar `str.length()` en vez de `str.length`. Esto no funciona.
133
+
```warn header="`length` es una propiedad"
134
+
Gente con experiencia en otros lenguajes a veces comete el error de tipear `str.length()` en vez de `str.length`. Eso no funciona.
132
135
133
136
Por favor notar que `str.length` es una propiedad numérica, no una función. No hay necedidad de agregar un paréntesis después de ella.
134
137
135
138
````
136
139
137
140
## Accediendo caracteres
138
141
139
-
Para acceder a un caracter en la posición `pos`, se debe usar paréntesis cuadrados `[pos]` o llamar al método [str.charAt(pos)](mdn:js/String/charAt). El primer caracter comienza desde la posición cero:
142
+
Para acceder a un carácter en la posición `pos`, se debe usar paréntesis cuadrados `[pos]` o llamar al método [str.charAt(pos)](mdn:js/String/charAt). El primer carácter comienza desde la posición cero:
140
143
141
144
```js run
142
145
let str = `Hola`;
@@ -149,9 +152,9 @@ alert( str.charAt(0) ); // H
149
152
alert( str[str.length - 1] ); // a
150
153
````
151
154
152
-
Los paréntesis cuadrados son una forma moderna de acceder a los caracteres, mientras que `charAt` existe principalmente por razones históricas.
155
+
Los corchetes son una forma moderna de acceder a los caracteres, mientras que `charAt` existe principalmente por razones históricas.
153
156
154
-
La única diferencia entre ellos es que si no se encuentra un caracter, `[]`retorna`undefined` (indefinido), y `charAt`retorna un string vacío.
157
+
La única diferencia entre ellos es que si no se encuentra un caracter, `[]`devuelve`undefined`, y `charAt`devuelve un string vacío.
155
158
156
159
```js run
157
160
let str =`Hola`;
@@ -170,9 +173,9 @@ for (let char of 'Hola') {
170
173
171
174
## Strings son inmutables
172
175
173
-
Strings no pueden ser modificados en JavaScript. Es imposible modificar un caracter.
176
+
Strings no pueden ser modificados en JavaScript. Es imposible modificar un carácter.
174
177
175
-
Intentemoslo para demostrar que no funciona:
178
+
Intentémoslo para demostrar que no funciona:
176
179
177
180
```js run
178
181
let str ='Hola';
@@ -218,7 +221,7 @@ Existen muchas formas de buscar por subcadenas de caracteres dentro de una caden
218
221
219
222
El primer método es [str.indexOf(substr, pos)](mdn:js/String/indexOf).
220
223
221
-
Este busca un `substr` en `str`, comenzando desde la posición entregada `pos`, y retorna la posición donde es encontrado el subcaracter o `-1` en caso de no encontrar nada.
224
+
Este busca un `substr` en `str`, comenzando desde la posición entregada `pos`, y retorna la posición donde es encontrada la coincidencia o `-1` en caso de no encontrar nada.
Existe también un método similar [str.lastIndexOf(substr, position)](mdn:js/String/lastIndexOf) que busca desde el final del string hasta el comienzo.
277
280
278
-
Este imprimirá las ocurrencias en orden reverso.
279
-
281
+
Este imprimirá las ocurrencias en orden invertido.
280
282
````
281
283
282
284
Existe un leve inconveniente con `indexOf` en la prueba `if`. No podemos utilizarlo en el `if` como sigue:
@@ -304,7 +306,8 @@ if (str.indexOf("Widget") != -1) {
304
306
```
305
307
306
308
````smart header="El truco bitwise NOT"
307
-
Uno de los trucos antiguos es el operador [bitwise NOT](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Bitwise_Operators#Bitwise_NOT)) `~`. Este convierte el número en un entero de 32-bits (elimina la parte decimal si es que existe) y luego reversa todos los bits en su representación binaria.
309
+
310
+
Uno de los trucos antiguos es el operador [bitwise NOT](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Bitwise_Operators#Bitwise_NOT)) `~`. Este convierte el número en un entero de 32-bits (elimina la parte decimal si es que existe) y luego invierte todos los bits en su representación binaria.
308
311
309
312
Para enteros de 32 bits, el llamado `~n` significa exactamente lo mismo que `-(n+1)` (debido al formato IEEE-754).
310
313
@@ -319,11 +322,11 @@ alert( ~-1 ); // 0, lo mismo que -(-1+1)
319
322
*/!*
320
323
```
321
324
322
-
Como podemos ver, `~n` es cero sólo si `n == -1`.
325
+
Como podemos ver, `~n` es cero sólo si `n == -1`. (para cualquier entero de 32-bit con signo).
323
326
324
327
Por lo que, la prueba `if ( ~str.indexOf("...") )` es veraz y el resultado de ``indexOf no es `-1`. En otras palabras, cuando es encontrado.
325
328
326
-
La gente lo usa para acrotar verificaciones `indexOf`:
329
+
La gente lo usa para acortar verificaciones `indexOf`:
327
330
328
331
```js run
329
332
let str = "Widget";
@@ -336,7 +339,10 @@ if (~str.indexOf("Widget")) {
336
339
Usualmente no es recomendado utilizar características linguisticas en formas no obvias, pero en particular, este truco es utilizado ampliamente en código antiguo, por lo que debemos entenderlo.
337
340
338
341
Recuerda: `if (~str.indexOf(...))` es leído como "si es encontrado".
339
-
````
342
+
343
+
Para ser preciso, como los números grandes son truncados a 32 bits por el operador `~`, existen otros números que dan `0`, el menor es `~4294967295=0`. Esto hace que tal chequeo sea correcto solo si el string no es así de largo.
344
+
345
+
Ahora podemos ver este truco solo en código viejo, porque JavaScript moderno provee el método `.includes` (ver a continuación).
340
346
341
347
### includes, startsWith, endsWith
342
348
@@ -350,7 +356,7 @@ alert('Widget con id'.includes('Widget')); // true
350
356
alert('Hola'.includes('Adios')); // false
351
357
```
352
358
353
-
El segundo argumento opcional de `str.includes` es la posición desde dónde comienza a buscar:
359
+
El segundo argumento opcional de `str.includes` es la posición desde donde comienza a buscar:
354
360
355
361
```js run
356
362
alert('Midget'.includes('id')); // true
@@ -386,7 +392,7 @@ Existen 3 métodos en JavaScript para obtener un substring: `substring`, `substr
386
392
alert( str.slice(2) ); // ringify, desde la 2nda posición hasta el final
387
393
```
388
394
389
-
Valores negativos para `comienzo/final` también son posibles. Ellos indican que la posición es contada desde el final del string.
395
+
También son posibles valores negativos para `comienzo/final`. Ellos indican que la posición es contada desde el final del string.
390
396
391
397
392
398
```js run
@@ -414,7 +420,7 @@ Existen 3 métodos en JavaScript para obtener un substring: `substring`, `substr
414
420
415
421
```
416
422
417
-
Argumentos negativos son (al contrario de slice) compatibles, son tratados como `0`.
423
+
Los argumentos negativos (al contrario de slice) no son soportados, son tratados como `0`.
418
424
419
425
`str.substr(comienzo [, largo])`
420
426
: Retorna la parte del string desde `comienzo`, con el `largo` dado.
@@ -443,16 +449,16 @@ Recapitulemos los métodos para evitar confusiones:
443
449
| `substr(comienzo, largo)` | desde `comienzo` toma `largo` caracteres | permite negativos `comienzo` |
444
450
445
451
```smart header="¿Cuál elegir?"
446
-
Todos son capaces de hacer el trabajo. Formalmente, `substr` tiene una pequeña desventaja: no es descrito en la especificación central de JavaScript, pero en Annex B, la cual cubre características sólo de navegadores, que existen principalmente por razones históricas. Por lo que entornos sin navegador pueden fallar en compatibilidad. Pero en la práctica funciona en todos lados.
452
+
Todos son capaces de hacer el trabajo. Formalmente, `substr` tiene una pequeña desventaja: no es descrito en la especificación central de JavaScript, sino en el anexo B, el cual cubre características sólo de navegadores, que existen principalmente por razones históricas. Por lo que entornos sin navegador pueden fallar en compatibilidad. Pero en la práctica funciona en todos lados.
447
453
448
-
Los autores generalmente usan `slice` casi todo el tiempo
454
+
De las otras dos variantes, `slice` es algo más flexible, permite argumentos negativos y es más corta. Entones, es sufuciente con, de estos tres métodos, recordar únicamente `slice`.
449
455
```
450
456
451
457
## Comparando strings
452
458
453
-
Como sabemos desde el capítulo <info:comparison>, strings son comparados caracter por caracter, en orden alfabético.
459
+
Como sabemos desde el capítulo <info:comparison>, strings son comparados carácter por carácter en orden alfabético.
454
460
455
-
Aunque, existen algunas singularidades.
461
+
Aunque existen algunas singularidades.
456
462
457
463
1. Una letra minúscula es siempre mayor que una mayúscula:
458
464
@@ -470,7 +476,7 @@ Aunque, existen algunas singularidades.
470
476
471
477
Para entender qué pasa, revisemos la representaciín interna de strings en JavaScript.
472
478
473
-
Todos los strings son codificados usando [UTF-16](https://es.wikipedia.org/wiki/UTF-16). Esto significa: cada caracter tiene un código numérico correspondiente. Existen métodos especiales que permiten obtener el carácter para el código y viceversa.
479
+
Todos los strings son codificados usando [UTF-16](https://es.wikipedia.org/wiki/UTF-16). Esto significa: cada carácter tiene un código numérico correspondiente. Existen métodos especiales que permiten obtener el carácter para el código y viceversa.
474
480
475
481
`str.codePointAt(pos)`
476
482
: Retorna el código para el caracter en la posición `pos`:
@@ -515,7 +521,7 @@ Ahora se vuelve obvio por qué `a > Z`.
515
521
Los caracteres son comparados por su código numérico. Código mayor significa que el caracter es mayor. El código para `a` (97) es mayor que el código para `Z` (90).
516
522
517
523
- Todas las letras minúsculas van después de las mayúsculas ya que sus códigos son mayores.
518
-
- Algunas letras como `Ö` se mantienen apartadas del alfabeto principal. Aquó, el codigo es mayor que cualquiera desde `a` hasta `z`.
524
+
- Algunas letras como `Ö` se mantienen apartadas del alfabeto principal. Aquí el codigo es mayor que cualquiera desde `a` hasta `z`.
519
525
520
526
### Comparaciones correctas
521
527
@@ -544,7 +550,7 @@ Este método tiene dos argumentos adicionales especificados en [la documentació
544
550
## Internals, Unicode
545
551
546
552
```warn header="Conocimiento avanzado"
547
-
Esta sección ahonda en string internals. Este conocimiento será útil para ti si pleaneas lidiar con emoticones, raros caracteres matemáticos, jeroglíficos o otros símbolos extraños.
553
+
Esta sección ahonda en string internals. Este conocimiento será útil para ti si pleaneas lidiar con emoticones, raros caracteres matemáticos, jeroglíficos u otros símbolos extraños.
548
554
549
555
Puedes saltar esta sección si no planeas mantenerlos.
550
556
```
@@ -589,7 +595,7 @@ alert('𝒳'.charCodeAt(0).toString(16)); // d835, entre 0xd800 y 0xdbff
589
595
alert('𝒳'.charCodeAt(1).toString(16)); // dcb3, entre 0xdc00 y 0xdfff
590
596
```
591
597
592
-
Encontrarás más formas de trabajar con pares sustitutos más adelante en el capítulo <info:iterable>. Probablemente hay bibliotecas especiales para eso también, pero nada lo suficientemente famoso como para sugerir aquí.
598
+
Encontrarás más formas de trabajar con pares sustitutos más adelante en el capítulo <info:iterable>. Probablemente hay bibliotecas especiales para eso también, pero nada lo suficientemente famoso como para sugerirlo aquí.
593
599
594
600
### Marcas diacríticas y normalización
595
601
@@ -665,4 +671,3 @@ Existen varios otros métodos útiles en cadenas:
665
671
666
672
667
673
Strings también tienen métodos para buscar / reemplazar con expresiones regulares. Pero ese tema merece un capítulo separado, así que volveremos a eso más adelante.
0 commit comments