mejorando.la: curso profesional de frontend, dominando javascript

99
Dominando JavaScript por David Avellaneda @davsket

Upload: david-ballen

Post on 25-Jan-2015

1.715 views

Category:

Technology


4 download

DESCRIPTION

JavaScript las partes feas y geniales, y patrones

TRANSCRIPT

Page 1: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Dominando JavaScript

por David Avellaneda @davsket

Page 2: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

@davsket?

Page 3: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

acerca de mi

• Ingeniero de Sistemas…

• Cofundador de monoku y monomi.co

• Co-organizador de BogotáJS

• Co-organizador de JSConf.co

Page 4: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Agenda

Page 5: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Agenda

• JavaScript: Las partes buenas

• JavaScript Orientado a Objetos (OO)

• Closures, Mixins, Objetos, Prototipos

• Patrones de Diseño y MV*

• APIs Rest, AJAX y Sockets (*)

Page 6: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

JavaScript: Las Partes Buenas

Page 7: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Recomendación: Compren el Libro

Page 8: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Las Partes Buenas?

Page 9: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

JavaScript: The Good Parts 80% Intro a JS

2% Hermosas características 10% Feas características

10% Malas partes

Page 10: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Las Partes Feas

Page 11: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Scope

Page 12: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 5, b = 10 !function noGlobal( a ){ var b = 3 a = a*2 return a * b } !noGlobal( 1 ) // 6 a // 5 b // 3

Page 13: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

typeof

Page 14: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

typeof new Number(8) == "object" typeof 8 == "number"

Page 15: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

parseInt

Page 16: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

parseInt ¡cuidado con los legacy browsers!

Page 17: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

parseInt( "08" ) // 0 parseInt( "08", 10 ) // 8

!Chrome ya no...

Page 18: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Números Flotantes

Page 19: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Gracias a "Binary Floating-Point Arithmetic (IEEE 754)"

!0.1 + 0.2 != 0.3

Page 20: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Valores Falsos (abstract equality comparison)

Page 21: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

'' == '0' // false 0 == '' // true 0 == '0' // true !false == 'false' // false false == '0' // true !false == undefined // false false == null // false null == undefined // true !' \t\r\n ' == 0 // true

Page 22: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

'' === '0' // false 0 === '' // false 0 === '0' // false !false === 'false' // false false === '0' // false !false === undefined // false false === null // false null === undefined // false !' \t\r\n ' === 0 // false

Page 23: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

hasOwnProperty

Page 24: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Cualquiera puede modificar el prototipo y generarte problemas!

Page 25: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

with

Page 26: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = { p: 0 }, c !with( a ){ p = 3 c = 5 } !a.p // 3 a.c // undefined c // 5

Page 27: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

eval

Page 28: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

No es tan maaaalo como lo pintan!

Page 29: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

eval("myValue = myObject." + myKey + ";");

Page 30: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

en vez de:

Page 31: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

myvalue = myObject[myKey]

Page 32: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

No usen eval para ejecutar código desde el servidor u otro servicio AJAX

Page 33: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

switch

Page 34: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

... fall through .. !

va de case en case naturalmente (requiere usar break)

valida con equivalencia simple

Page 35: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var blah = 0; switch (blah) { case -1: alert('negative 1'); case 0: alert(0) case 1: alert(1); break; case 2: alert(2); break; default: alert('default'); }

Page 36: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Doble Filo!!

Page 37: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Punto y Coma Opcional (optional semicolon)

!- Código más limpio -

Page 38: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Declaraciones Sin Corchetes (block-less statements)

Page 39: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

if( a ){ a.b = 3 }

Page 40: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

if( a ) a.b = 3

Page 41: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

if( a ){ a.b = 3 a.c = 4 }

Page 42: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

if( a ) a.b = 3 a.c = 4

Page 43: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

if( a ){ a.b = 3 } a.c = 4

Page 44: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

++ --

Page 45: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = [1,2,3,4], i = 0 a[i++] // 1 a[++i] // 3

Page 46: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

new

Page 47: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

"this"

Page 48: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

métodos vs funciones

Page 49: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

hoisting

Page 50: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

el orden de definición de variables y funciones afecta el resultado

Page 51: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function f(){ alert( a ) a = 5 } f()

Page 52: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function f(){ alert( a ) a = 5 } f() // ReferenceError a is not defined

Page 53: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function f(){ alert( a ) var a = 5 } f()

Page 54: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function f(){ alert( a ) var a = 5 } f() // undefined

Page 55: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function f(){ var a alert( a ) a = 5 } f() // undefined

Page 56: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 !function f(){ alert( a ) var a = 5 } !f()

Page 57: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 !function f(){ alert( a ) var a = 5 } !f() // undefined

Page 58: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 !function f(){ var a alert( a ) a = 5 } !f() // undefined

Page 59: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 !function f(){ a = 5 alert( a ) function a(){} } !f() // ? a // ?

Page 60: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 function f(){ a = 5 alert( a ) function a(){} } f() // 5 a // ?

Page 61: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var a = 10 function f(){ a = 5 alert( a ) function a(){} } f() // 5 a // 5 ? no... 10!!

Page 62: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

The Cool Parts + Patterns

Page 63: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Prototype

Page 64: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

JavaScript es Orientado a Objetos (OO) pero no tiene

Clases !

JavaScript es basado en Prototipos

Page 65: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

functions con prototype

Page 66: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function Persona( name ){ this.name = name } Persona.prototype.alertName = function(){ alert( this.name ) } Persona.prototype.setAge = function( age ){ this.age = age } var juan = new Persona( 'juan' )

Page 67: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

juan.alertName() // juan juan.setAge( 25 ) !Persona.prototype.sayYolo = function(){ alert(this.name + ': YOLO!') } !juan.sayYolo() // juan: YOLO!

Page 69: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

constructor

Page 70: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

juan.constructor // function Persona( ...

Page 71: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

__proto__ (no es standard)

(firefox, chrome, opera, android, ie11)

Page 72: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

juan.__proto__

Page 73: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Function are first-class objects

Page 74: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

¿first-class objects?

• se pueden asignar a variables

• se puede recibir/pasar como argumentos

• se pueden retornar en una función

• son objetos y por lo tanto tienen propiedades

Page 75: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Function are first-class objects

=> Chain

Callback Observable Delegation

Closure MVC

MVVM MV*

Page 76: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Chain

Page 77: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

var o = { i: 0, f: function(){ ++ this.i return this } } o.f().f().f() o.i // 3

Page 78: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

$('#myelem') .hide() .css({..}) .data(..) .fadeIn(..)

Page 79: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Callback ( Async ) "las funciones pueden ser pasadas

como argumentos"

Page 80: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Es como una sala de espera en la que dependiendo del turno tu puedes ser llamado

Page 81: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

function caller( cb ){ setTimeout(function(){ cb( new Date() ) }, 1000) } caller(function( now ){ alert( now ) })

Page 82: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

$(document).on('click', click) function click(){ alert('auch!') }

Page 83: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

$.ajax({ url: ".", type: "get" }) .done(function(){ console.log("async!") }) console.log("sync")

Page 84: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Observable + "y Las funciones pueden asignarse a variables"

Page 85: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Este patrón permite que diferentes interesados se suscriban a un objeto escuchando eventos

Page 87: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Delegación

Page 88: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Observar cientos de elementos con cientos de

eventListeners no es recomendable

Page 89: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Aplica en listados

Page 90: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

document.getElementById("parent-list") .addEventListener("click",function(e) { if(e.target && e.target.nodeName == "LI") { console.log("List item ", e.target.id.replace("post-")," was clicked!"); } });

Page 91: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

$('#padre').on('click', '.hijo', callback)

Page 92: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Closures

Page 93: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

se reduce a: invocación inmediata de

funciones

Page 94: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

(function(){ var hidden = 8 }()) !console.log( typeof hidden ) // undefined

Page 95: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

MVC / MVVM / MV*

Page 96: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript
Page 97: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Sfotipy!

Page 98: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Sfotipy!

• Agregar jQuery

• Crear nuestro Modelo

• Crear nuestra Vista

• Crear nuestro Controlador

• Observables!

Page 99: Mejorando.la: Curso Profesional de Frontend, Dominando JavaScript

Gracias!!