[Javascript] Conferencia 01. Douglas Crockford
Introducción
Desde un tiempo a esta parte he estado programando en javascript como la mayoría lo hacemos, cuando necesitamos algo que no sabemos lo buscamos en google. Después: Ctrl A + Ctrl C + Ctrl V. Modificación del código para mis necesidades y listo. Probablemente es uno de los lenguajes más desconocidos y a la vez más usado, en mi opinión tiene mucho potencial y por eso decidí aprenderlo más en profundidad, desde el principio, como aprendí pascal, java, c, o cualquier otro.
Para ello he seguido una serie de conferencias, he leído mucho y sobretodo he programado. Así que voy a hacer una serie de posts sobre este tema, con explicaciones sobre las conferencias, mis propios apuntes y con el video en el propio post, si, al estilo catonmat.net, con el que tanto he aprendido.
He de decir que si todo el mundo se tomara el streaming docente en serio, como si estuviera en una clase importante en la uni, probablemente se aprendería mucho más, y de repente todo podría cambiar.
Conferencia 01. Introducción
En esta conferencia de Douglas Crockford (Yahoo Inc.), presenta la importancia de Javascript, y las cosas básicas sobre este lenguaje.
Historia e Importancia de JavaScript
Javascript fue lanzado en Marzo de 1996, cuando Internet Explorer estaba en su versión 3.0. El autor fue Brendan Eich, de Netscape. Después ha ido evolucionando con varios nombres: Mocha -> Livescript -> Javascript.
Fue el primer lenguaje que se podía poner en un servidor web (ejecución a través de http, se entiende) y en los navegadores. Ha pasado por muchas fases, y se han ido incluyendo nuevas funcionalidades, pero no quiero enrollarme con eso, que te aburro.
La importancia de Javascript se ve desde 3 puntos:
- Es un lenguaje real, es decir, al usarse en el desarrollo web, e integrado dentro un documento html, que incluye, lógicamente html (que no es un lenguaje), se tiende a pensar que no es de verdad.
- Es pequeño, en el sentido que no tiene muchas funciones por defecto ni muchos tipos de datos, como sí pasa con Java, por ejemplo. A pesar de eso es muy potente, como veremos.
- No es un subconjunto de Java. Es decir lo único en común que tienen Java y Javascript (exagerando un poco) es “Java”.
Ideas clave:
- “Vagamente” tipado.
- Se carga y se ejecuta.
- Los objetos se usan como contenedores.
- Los objetos heredan de otros objetos, no hay clases.
- Lambda. Funciones como objetos.
- Uso de variables globales como enlace entre funciones.
De todo esto no te preocupes, porque se hablará más adelante.
Tipos de datos
Numbers
Solo un tipo de números, no integer. El tipo number es IEEE-754, es decir del tipo Double de toda la vida.
Tiene un problema con la aritmética, por ejemplo: 0.1 + 0.2 = 0.30000000000000004, no 0.3. Que parece un detalle tonto, pero si estamos hablando de dinero en grandes cantidades la puedes liar.
- NaN. Es un tipo especial de number. Es especial, porque precisamente indica que no es un number. Se suele obtener en operaciones erróneas y si se concatenan varias operaciones y a la mitad obtienes un NaN, como salida vas a tener NaN, puesto que cualquier operación aritmética con NaN como entrada, tiene NaN como salida.NaN no es igual a nada, ni siquiera a NaN.
- Number(valor) ó +valor. Convierte valor a number, si hay algun problema, entonces valor=NaN.
- parseInt(valor,10). Convierte valor a number. El 10 puede ser 08, 16…dependiendo de si estamos trabajando en octal o hexa.
- Más funciones. De la clase Math de Java(abs, floor, log, max….). Todos aquí
Strings
No existe el tipo caracter, es un string de longitud 1.
Son inmutables, y la comparación entre strings es curiosa, porque dos strings similares son iguales con (==).
Comillas dobles o simples. ‘aKc’ ó “aKc”. Es igual.
- string.length. Longitud de string.
- String(valor). Convierte valor a string.
- Más métodos (charAt, concat, indexOf, match, replace….). Todos aquí
Null
Un tipo de dato que representa “nada”, es decir que no tiene un valor asociado.
undefined
Un tipo de dato que ni siquiera es un tipo de dato, es el valor por defecto para variables, parámetros y atributos de un objeto que no existen.
Boolean
Valores true ó false
- Boolean(valor) ó !!valor. True si valor es truthy. False si valor es falsy. (ahora se explicará esto)
- Valores falsy.
- false
- null
- undefined
- “” (string vacío)
- 0
- NaN
- Valores truthy.
- El resto. “0″, “false”…. Fácil, ¿verdad? Sigamos.
Todo lo demás -> Objetos
new Object(). Genera un contenedor vacío del par nombre/valor. Nombre puede ser cualquier string, y valor puede tener cualquier valor excepto undefined.
A los valores se puede acceder con obj["nombre"] ó con obj.nombre. El único requisito es que cuando accedas con el punto, “nombre” no puede ser una palabra reservada.
La implementación interna es una tabla Hash, pero no hay métodos relacionados con esto, como rehash ni cosas por el estilo.
Cualquiera de los tipos de datos explicados puede almacenarse en una variable, o se puede pasar a una función.
Sintaxis y operadores
La sintaxis de Javascript es bastante similar a la de C, salvo porque en Javascript las funciones pueden ser variables, como:
1 2 3 4 | var sumar = function(a, b) { return a+b; } |
Los identificadores empiezan por $ ó una letra ó un _. Seguidos de 0 o más letras, _, $ ó dígitos.
Por convención -> Minúsculas, menos los constructores, que empiezan por mayúscula.
Comentarios
1 2 3 4 | // Esto es un comentario /* Y este otro */ |
Operadores aritméticos (+ – * / %)
+ (Suma y concatenación)
- Binario: Suma y concatenación de strings. Es decir si son numbers los dos operandos los suma, sino los transforma a strings y los concatena.
- Unario: Convierte string a number, como se ha dicho al principio.
/ (División, produce un resultado no entero)
- 10 / 3 = 3.3333333333333335
Operadores de comparación (== != < > <= >=)
== y !=. Comparan como se espera, lo único destacable es que es mejor utilizar === y !==, porque también comparan el tipo de dato aparte del valor. Y la velocidad del programa sube.
Operadores lógicos
&& . Si el primer operando es truthy entonces devuelve el segundo operando, si no devuelve el primero. Un uso especial de esto:
1 2 3 4 5 6 7 | /* Si a no es null entonces devolvemos el atributo velocidad.*/ if (a) { return a.velocidad; } else { // Si no, devolvemos null return a; } |
Esto se puede hacer de una manera más limpia y con una ejecucion más rápida
1 2 3 4 5 | return a && a.velocidad; /*Si a es truthy (no null, por ejemplo), entonces devuelve el segundo operando, sino el primero */ |
|| . Si el primer operando es truthy entonces devuelve el primer operando, sino es el segundo. Ejemplo
1 2 | var uvas = recogidas || almacenadas; // uvas = almacenadas si recogidas es falsy. |
! . NOT. Si es truthy el valor pasado -> false, si es falsy -> true.
!! . Procuce boolean, true o false si es truthy o falsy, el valor que le pasamos
Operadores a nivel de bit (& | ^ >> >>> <<)
Desaconsejados por la implementación interna del lenguaje.
Estos operadores, convierten el valor a un entero con signo de 32 bits, y devuelven el valor en coma flotante de 64 bits.
Consecuencia -> Más lento en ejecución.
Apuntes propios
Vídeo
Continuará…

Deja tu comentario