Elementos del lenguaje 2

Continuando con el estudio de los elementos del lenguaje, en este capítulo se estudian otros tipos de datos de uso frecuente.

Datos de tipo cadena (String)

Los datos en programación pueden ser igualmente de tipo texto, conocidos como cadenas de caracteres o simplemente cadenas (strings por su denominación en inglés).

Las cadenas se crean escribiendo el texto entre comillas o entre apóstrofos. También pueden ser creadas escribiendo el texto entre acentos graves: ` ` (tildes invertidas).

Por ejemplo, en las siguientes instrucciones se asignan dos cadenas a las variables "s1" y "s2":

var s1 = "Programación en",
s2 = " JavaScript";
print(s1, s2)

En JavaScript, las variables no tienen un tipo de dato predefinido. Las variables toman su tipo del valor que se les asigna, así, las variables a las que se les asigna un número, son de tipo numérico (number) y las variables a las que se les asigna una cadena, como es el caso de "s1" y "s2", son de tipo cadena (string).

El tipo de dato de una variable puede ser determinado con el operador typeof, por ejemplo, para averiguar el tipo de dato de las variables "s1" y "s2", se escribe:

print(typeof s1, typeof s2)

Como era de esperar, typeof, informa que las variables son de tipo cadena (string). Si se crean tres variables: "n1", "n2" y "n3", con tres números y se imprime su tipo de dato, se obtiene:

var n1 = 12, n2 = 16, n3 = 21;
print(typeof n1, typeof n2, typeof n3)

Con las cadenas se puede emplear el operador de suma (+), que en el caso de las cadenas, concatena (une) dos o más cadenas, como se muestra en las siguientes instrucciones:

s1+s2
var s3 = 'Juan Carlos', s4 = 'Romero Céspedes';
s3+' '+ s4

Observe que, para concatenar los nombres y los apellidos (s3 y s4), se añade un espacio (' ') para evitar que el segundo nombre y el primer apellido queden juntos.

Como ya se vio, las variables pueden ser declaradas también con let y const, pero estos comandos se emplean casi siempre al interior de las funciones (y otros bloques de código).

Si se crea un texto con comillas, en su interior los apóstrofos son tratados como texto normal, igualmente, si se crea un texto con apóstrofos, en su interior las comillas son tratadas como texto normal:

print("El tipo de una 'variable' se obtiene con 'typeOf'")
print('El "texto", en programación, se denomina "cadena"')

Para escribir comillas, en un texto creado con comillas, se debe escribir un quebrado invertido (\) delante de las comillas (lo que se denomina secuencia de escape). Igualmente, en un texto creado con apóstrofos, se debe escribir un quebrado invertidio (\) delante de los apóstrofos:

print("El tipo de una \"variable\" se obtiene con 'typeOf'")
print('El \'texto\', en programación, se denomina "cadena"')

Como se dijo, las cadenas pueden ser creadas también con acentos graves y, en ese caso, se denominan plantillas literales (o plantillas cadena) porque es posible incorporar en ellas expresiones JavaScript. Además, dentro de las plantillas literales se pueden emplear saltos de línea, así como comillas y apóstrofos:

print(`Las variables en "JavaScript" pueden ser declaradas con 'var', 'let' o 'const'.`)
Las variables en "JavaScript" pueden ser declaradas con 'var', 'let' o 'const'.

Para insertar una expresión JavaScript en una plantilla literal, se sigue la sintaxis: ${expresión_JavaScript}. Por ejemplo, en la siguiente instrucción, se crea una plantilla literal que muestra el resultado de calcular la raíz cuadrada de 2:

print(`La raíz cuadrada de 2 es: ${Math.sqrt(2)}`)

En la siguiente, se muestra el resultado de calcular la hipotenusa de dos números:

`La hipotenusa de 5 y 8 es: ${Math.hypot(5,8)}`

Y en la siguiente, se crea la variable "n1" con el número 3.187, se calcula el seno hiperbólico de "n1", se guarda el resultado en la variable "senoh" y se muestra el mensaje respectivo en una plantilla literal:

var n1 = 3.187; var senoh = Math.sinh(n1); `El seno hiperbólico de ${n1} es: ${senoh}`

El mismo resultado puede ser obtenido empleando el operador de concatenación (+):

"El seno hiperbólico de "+n1+" es: "+senoh

Cuando se emplea el operador "+", JavaScript realiza automáticamente las operaciones de conversión necesarias. En el ejemplo, convierte los valores de "n1" y "senoh" en cadenas y luego las une a las cadenas existentes. Sin embargo, las plantillas literales son más compactas y permiten escribir cadenas con saltos de línea y emplear comillas simples y dobles en su interior.

Las cadenas de caracteres son de uso frecuente en programación, pues la mayoría de la información que se recibe del y/o muestra al usuario, está en forma de texto.

En el siguiente ejemplo y en los ejercicios correspondientes, se emplearán dos funciones (métodos) disponibles en JavaScript (en el objeto Windows) para pedir y mostrar información: alert y prompt.

La instrucción alert despliega un cuadro de diálogo con un mensaje correspondiente a la información que se quiere mostrar y un botón Aceptar, en el que se debe hacer clic para cerrar el cuadro de diálogo. El cuadro de diálogo se muestra sobre la página.

Su sintaxis es la siguiente:

alert("mensaje")

Donde mensaje es el texto que aparece en el cuadro de diálogo.

La instrucción prompt despliega un cuadro de diálogo donde el usuario puede escribir texto.

El cuadro de diálogo prompt tiene dos botones: Aceptar y Cancelar. Si el usuario pulsa el botón Aceptar, prompt devuelve el texto escrito, si pulsa Cancelar, prompt devuelve null (nulo).

Su sintaxis es la siguiente:

variable = prompt("mensaje", "valor por defecto")

Donde: mensaje es el texto que se muestra, en el cuadro de diálogo, para orientar al usuario con relación a la información que se le solicita.

Valor por defecto, es el texto que aparece inicialmente en el campo donde el usuario debe escribir el texto. Este texto sirve de ejemplo para el usuario. Este parámetro puede ser omitido (o ser una cadena vacía: ""), en cuyo caso no aparece ningún texto inicial en el cuadro de diálogo.

El valor que devuelve esta función es siempre de tipo texto (String), por lo que para transformarla en número (u otro tipo de dato) se debe emplear alguna de las funciones (u operadores) disponibles en el lenguaje. Por ejemplo, para convertir el texto escrito por el usuario en un número, se pueden emplear las funciones: parseFloat, parseInt y eval. Además, la mayoría de las funciones y operadores matemáticos, convierten automáticamente el texto a número cuando así se requiere.

Por ejemplo, en las siguientes instrucciones se pide al usuario, con la función prompt, que escriba un número. Ese número es guardado en la variable "valor", pero es un texto (no un número). En este caso el texto es convertido automáticamente en número por la función cbrt. Luego, se emplea una plantilla literal para convertir el resultado (que es un número) en texto y mostrarla al usuario con alert, finalmente se muestra el mismo resultado en la calculadora (evalúe la instrucción, con Shift+Enter, para ver en acción "prompt" y "alert").

var valor = prompt("Escriba un número válido:","0");
var rcubica = Math.cbrt(valor);
alert(`La raíz cúbica de ${valor} es: ${rcubica}`);

Después de ejecutar las anteriores instrucciones, podrá comprobar que la variable "valor" es de tipo cadena (string), no "undefined" como se muestra en este momento:

print(typeof valor, typeof rcubica)

El ejemplo puede ser resuelto también calculando directamente el resultado en la instrucción alert:

var valor = prompt("Escriba un número válido:","0");
alert(`La raíz cúbica de ${valor} es: ${Math.cbrt(valor)}`);

Si bien muchas de las conversiones de texto a número y viceversa, son manejadas automáticamente por JavaScript, se debe tener presente que la información introducida por el usuario está en forma de texto y que la información mostrada al usuario está, también, en forma de texto.

Las cadenas (strings) tienen varios métodos que permiten manipularlas. Estos métodos serán presentados y estudiados, a medida que se requieran. Por el momento, sin embargo, es suficiente conocer las tres formas en que pueden ser creadas y saber que el operador (+) puede ser empleado para concatenarlas (unirlas).

Datos de tipo booleano (Boolean)

Los datos de tipo booleano (de tipo lógico) sólo pueden tener uno de dos valores true (verdadero) o false (falso). El resultado de cualquier expresión relacional (o lógica), es siempre un valor booleano, tal como se demuestra en los siguientes ejemplos:

var b1 = true;
var b2 = false;
var b3 = 34>20;
var b4 = 7==6;
print(b1, b2, b3, b4);
print(typeof b1, typeof b2, typeof b3, typeof b4);

En JavaScript se pueden emplear (en primera instancia) los siguientes operadores relacionales:

Operadores Relacionales
OperadorDescripción
==Igual a
!=Diferente de
>Mayor a
<Menor a
>=Mayor o igual a
<=Menor o igual a

Que tienen el mismo significado (la misma semántica) que los operadores matemáticos equivalentes (=, ≠, >, <, ≥, ≤). Así, >= (≥), es verdadero (devuelve true) si el valor a su izquierda es mayor o igual al valor a su derecha (existen dos operadores relacionales más, pero los mismos serán estudiados posteriormente).

Datos de tipo arreglo (Array)

Otro tipo de dato de uso frecuente son los arreglos (vectores y matrices), más conocidos como arrays (por su denominación en inglés). En JavaScript, los arreglos se declaran simplemente escribiendo sus elementos (separados con comas) entre corchetes, como se muestra en los siguientes ejemplos:

var v1 = [1, 2, 3, 4, 5];
var v2 = ["a", "b", "c", "d", "e"];
print(v1, v2);
print(typeof v1, typeof v2);

En estas instrucciones se han creado dos arreglos "v1" y "v2", el primero con 5 números y el segundo con 5 letras, sin embargo, como se puede ver, al imprimir el tipo de dato se obtiene object, no como se esperaría array.

Esto se debe a que los arreglos no son un tipo de dato primitivo (un tipo de dato base), sino mas bien un tipo de dato estructurado (compuesto por dos o más datos de tipo simple). En JavaScript, el tipo arreglo, ha sido implementado en una clase, la clase Array. Todos los arreglos son instancias (objetos) de la clase Array, por esa razón (dado que son objetos), cuando se pide su tipo se obtiene object.

Para obtener el tipo de dato, más propiamente la clase de objeto, se debe recuperar el nombre del constructor del objeto (el nombre de la clase):

print(v1.constructor.name, v2.constructor.name)

Por lo tanto, "v1" y "v2" son objetos de la clase Array.

Para emplear los elementos de un arreglo, se escribe su nombre (el nombre de la variable) y entre corchetes su índice (su posición). La primera posición, el índice del primer elemento, es 0.

Los elementos de un array se emplean igual que una variable normal de ese tipo. Así un elemento de tipo numérico, se emplea igual que cualquier variable de tipo Number, un elemento de tipo cadena se emplea igual que cualquier variable de tipo String, etc.

Por ejemplo, en la siguiente instrucción, se calcula la raíz cúbica de la suma del primer, tercer y quinto elementos del arreglo "v1":

Math.cbrt(v1[0]+v1[2]+v1[4])

En JavaScript, los arreglos son dinámicos. Esto significa que su tamaño (el número de elementos) puede ser modificado en cualquier momento, lo que es de mucha utilidad cuando se elaboran programas de propósito general.

En JavaScript, los elementos no sólo pueden ser de cualquier tipo, sino que, un mismo arreglo, puede tener elementos de diferentes tipos. Por ejemplo, en la siguiente instrucción, se crea un arreglo con datos de tipo cadena, numéricos, booleanos y Array:

var v3 = ["uno", 1, "dos", 2, true, false, ["r", "s"], 2.1e34];
v3

Los arreglos en Javascript tienen varios métodos, algunos de los cuales serán introducidos a medida que se requieran, mientras que el resto serán estudiados en un capítulo dedicado a los mismos. Por el momento es suficiente saber como se declaran (se crean) y como se utilizan para realizar operaciones simples.