Estructuras de Datos¶
Datasets¶
Esto son arrays. Pueden contener tipos diferentes:
> a = [17, 21, false, "pero"]
[ 17, 21, false, 'pero' ]
> a[2]
false
> a[0]
17
Objetos¶
Se definen mediante:
var obj1 = { propiedad_1: valor_1,
...,
propiedad_n: valor_n }
en donde “valor_i” puede ser cualquier cosa (función, objeto, ...).
Por ejemplo:
> var empleado = { nombre: "José María",
edad: 38,
roles: ["alfarero", "pintor"],
activo: false,
ids: {dni:123456,
passport: 9876543}
activate: function () {this.activo = true }
}
undefined
> empleado["nombre"]
'José María'
> empleado.edad
38
> empleado.edad = 39
39
> empleado.activate()
undefined
> empleado.activo
true
En este ejemplo, vemos que el objeto tiene diferentes tipos de datos e incluso una función. Hablaremos de:
- propiedades: cuando contienen valores
- métodos: funciones definidas dentro de un objeto.
Vemos que tenemos diferentes formas de acceder a las propiedades y métodos:
obj["nombre"]
obj.nombre
obj["metodo"]()
obj.metodo()
En JavaScript todo salvo null y undefined tiene propiedades:
> var a="Hola"
undefined
> a.length
4
> a.toUpperCase()
'HOLA'
> var b = []
undefined
> b.push("Hola", "mundo", "cruel")
3
> a.join("--")
'Hola--mundo--cruel'
> a.pop(1)
'mundo'
> a
[ 'Hola','cruel']
Si hacemos referencia a métodos inexistentes:
> var a = {hola:"mundo"}
undefined
> a.hola
'mundo'
> a.adios
undefined
Nota
aquí puede tener más sentido la diferenciación entre null y undefined.
Podemos borrar propiedades de un objeto y comprobar si existen ciertas propiedades en un objeto:
> var a = {hola:"mundo",adios:"trabajo"}
undefined
> "adios" in a
true
> delete a.adios
true
> "adios" in a
false
Nota
un array es un objeto especializado en almacenar secuencias de datos.
Mutabilidad¶
Una instancia podrá hacer referencia a otra instancia y para JavaScript será como si ambas fueran la misma. Sin embargo, dos instancias con las mismas propiedades y métodos se considerarán objetos diferentes:
> var obj1 = { edad: 25 }
undefined
> var obj2 = obj1
undefined
> var obj3 = { edad:25 }
undefined
> obj1 == obj2
true
> obj1 == obj3
false
> obj2.edad = 30
30
> obj1.edad
30
El comportamiento del resto de tipos no es análogo:
> var a = 25
> var b = a
> var c = 25
> a == b
true
> a == c
true
> b = 30
30
> a
25
Nota
los valores son inmutables.
Iterar¶
Podemos iterar en los objetos (y como consecuencia en los arrays):
> var a = {hola:"jose",adios:"pedro",callme:function(){console.log("calling")}}
> for (var i in a) { console.log(i) }
hola
adios
callme
undefined
Nota
ya vimos un ejemplo con array.
Arrays - Métodos¶
Tenemos:
- push: añade elementos al final de un array.
- pop: quita el último elemento de un array (o el del índice indicado).
- shift/unshift: son los equivalentes pero en el comienzo del array.
- indexOf: para sacar el índice del primer elemento que se encuentra en un array.
- lastIndexOf: lo mismo pero encuentra el último índice.
- slice: extrae un trozo de array. slice(firstIndex, lastIndex) el primero se incluye y el segundo no.
- concat: pega dos arrays.
Strings - Métodos¶
Por ejemplo:
- length
- toUpperCase
- toLowerCase
- slice
- indexOf
- trim: elimina los espacios en blanco de una cadena.
- trimRight
- trimLeft
- charAt
Funciones¶
Objeto “arguments”¶
Dijimos que una función admite cualquier número de parámetros:
> function f1() {}
undefined
> f1("a",31) // funciona sin problemas
undefined
> function f2(a,b,c) {}
undefined
> f2() // funciona sin problemas
undefined
Dentro del scope local de cada función existe el objeto arguments:
> function f() { return arguments.length }
undefined
> f("hola",35,true)
3
> function f() { return arguments }
> f("hola",35,true)
{ '0': hola',
'1': 35,
'2': true }
> function f() { return arguments[1] }
undefined
> f("hola",35,true)
35
Objeto - Math¶
El objeto Math agrupa una serie de funciones matemáticas. Tiene los métodos:
- max
- min
- sqrt
- cos / sin / tan / acos / asin / atan
- PI
- random
- floor
- ceil
- round
Objeto - global¶
Lo que se almacena en el namespace global es accesible en el objeto global:
> global
{ ...
... }
Nota
en los navegadores, el namespace global se representa mediante el objeto window.
Advertencia
no conviene contaminar con variables el namespace “global”. Aumenta el riesgo de sobreescribir algo que no debamos. JavaScript no avisa si vamos a sobreescribir una variable que ya existe.