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.