javascript para desarrolladores de c# edin kapić

58
JavaScript para desarrolladores de C# Edin Kapić

Upload: leticia-rio

Post on 10-Feb-2015

17 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: JavaScript para desarrolladores de C# Edin Kapić

JavaScript para desarrolladores de C#

Edin Kapić

Page 2: JavaScript para desarrolladores de C# Edin Kapić

JavaScript

Edin Kapić

C#!=

Page 3: JavaScript para desarrolladores de C# Edin Kapić

JavaScript: “With or Without You”

Brendan Eich“El padre de la

criatura”

Page 4: JavaScript para desarrolladores de C# Edin Kapić

¿Cómo llegamos hasta aquí?

1995Netscape Navigator

2.0Mocha/LiveScript

1996Internet Explorer

3.0JScript

1997ECMAScript

Page 5: JavaScript para desarrolladores de C# Edin Kapić

1999XMLHttpRequest(OWA Exchange

2000)

2005Jesse James

GarrettAJAX

2006John Resig

jQuery

Page 6: JavaScript para desarrolladores de C# Edin Kapić

2009PhoneGap

2010Node.js

2011Windows 8

2012SharePoint 2013

TypeScript

TypeScript

Page 7: JavaScript para desarrolladores de C# Edin Kapić

Hay que saltar de una vez

Page 8: JavaScript para desarrolladores de C# Edin Kapić

JsFiddle

Firebug / IE Dev Tools

JSLintJSHint

Las herramientasFirebugLite

Page 9: JavaScript para desarrolladores de C# Edin Kapić

JavaScript es bueno ...• Lenguaje dinámico• Notación literal potente• “Loose-typed”

• “JS is Lisp in C Clothing” (Douglas Crockford)

http://bit.ly/Qn0qLi

Page 10: JavaScript para desarrolladores de C# Edin Kapić

... pero tiene cosas malas• Variables globales implícitas• Variable hoisting• Function hoisting• Prototype Leaking• ==

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

Page 11: JavaScript para desarrolladores de C# Edin Kapić

JavaScript != C#

Page 12: JavaScript para desarrolladores de C# Edin Kapić

• C#– Corta el pan– Tiene mecanismos

de seguridad– Es complejo

• JavaScript– Corta el pan– Te puedes hacer

daño– Es un trozo de

metal con un mango

Page 13: JavaScript para desarrolladores de C# Edin Kapić

Bueno en C#, malo en JS• La sintaxis parecida nos puede llevar

a hacer lo que en C# son buenas prácticas

• ...pero en JS pueden tener consecuencias graves

• “If it walks like a duck...”

Page 14: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 1: Tipos de datosSimples• Number• String• Boolean• Undefined• Null

Complejos• Object• Array• Function• RegExp• Date

Page 15: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 2: Variables globales

• Toda variable no asignada a un objeto, se asigna a window

• var a = 1;• window.a = 1;

http://jsfiddle.net/wQDwN/

Page 16: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 3: “Variable Hoisting”

• Sólo dos niveles: global i función– { } no crea ámbito de variable (como

C#)

• La variable declarada sube hasta el inicio de la función en la que está declarada– /*.....*/ var a = 1;– var a; /*.....*/ a = 1;

http://jsfiddle.net/NE2Km/3/

Page 17: JavaScript para desarrolladores de C# Edin Kapić

Recomendación• Ser consciente de los tipos de

datos• No contaminar window• Declarar variables lo más arriba

possible (hacer hoisting explícito)

Page 18: JavaScript para desarrolladores de C# Edin Kapić

Testvar imAGlobal = true; function globalGrabber() { imAGlobal = false; return imAGlobal;} console.log(imAGlobal); console.log(globalGrabber()); console.log(imAGlobal); // true o false?

Page 19: JavaScript para desarrolladores de C# Edin Kapić

Testvar imAGlobal = true; function globalGrabber() { var imAGlobal = false; return imAGlobal;} console.log(imAGlobal); console.log(globalGrabber()); console.log(imAGlobal); // true o false?

http://jsfiddle.net/JxESg/

Page 20: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 4: this• this apunta al objeto contenedor de la función

en la que está (en ejecución) y es modificable

console.log(this); // windowvar myFunction = function() { console.log(this);}myFunction(); // window

http://jsfiddle.net/UsCtz/ y http://jsfiddle.net/8tBEM/

Page 21: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 5: Wrappers• JS estilo C#

var myVar = new Object();var myArr = new Array();

• JS estilo purovar myVar = {};var myArr = [];

Page 22: JavaScript para desarrolladores de C# Edin Kapić

Recomendación• No usar wrappers innecesariamente• Aprender la notación literal de

objetos de JS

Page 23: JavaScript para desarrolladores de C# Edin Kapić

Testvar a = new Object();a.nombre = 'Edin';console.log(a.nombre);

Page 24: JavaScript para desarrolladores de C# Edin Kapić

Testvar a = { nombre: 'Edin'};console.log(a.nombre);

Page 25: JavaScript para desarrolladores de C# Edin Kapić

Testvar a = function(){ this.nombre = 'Edin'; return this;}();console.log(a.nombre);

Page 26: JavaScript para desarrolladores de C# Edin Kapić

Testvar a = function(){ this.nombre = 'Edin'; return this;}();console.log(a.document.URL);

Page 27: JavaScript para desarrolladores de C# Edin Kapić

Testvar a = function(){ var obj = {}; obj.nombre = 'Edin'; return obj;}();console.log(a.document.URL);

Page 28: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 6: Truthy / FalseyValores que dan true

• "0"• "false"• Objetos vacíos• Todos los demás

Valores que dan false

• false• 0• ""• null• undefined• NaN

Page 29: JavaScript para desarrolladores de C# Edin Kapić

Recomendación• Simplificar los condicionales

if(myVar != "" || myVar != undefined)if(myVar)

• Inicializar los valores por defectoif(myVar == "") { myVar = "Hola"; }myVar = myVar || "hola";

Page 30: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 7: Operador ==• Comparación

if(false == 0) // trueif(false === 0) // false

• El operador == intenta convertir los valores y casi siempre es algo que no queremos

Page 31: JavaScript para desarrolladores de C# Edin Kapić

Comparación “indeterminista”(false == 0); // true (false == ""); // true (0 == ""); // true (null == false); // false(null == null); // true(undefined == undefined); // true(undefined == null); // true(NaN == null); // false(NaN == NaN); // false

Page 32: JavaScript para desarrolladores de C# Edin Kapić

Recomendación• Usar los operadores === i !== por

defecto• No hacen la conversión de valores• Se comportan como los operadores

“habituales” == y != de C#

Page 33: JavaScript para desarrolladores de C# Edin Kapić

JS != C# 8: Otras “perlas”• parseInt() • Operador + http://jsfiddle.net/tbMX2/• NaN http://jsfiddle.net/vVgB9/ • “Prototype Leak”• Inserción de ;

Page 34: JavaScript para desarrolladores de C# Edin Kapić

Funciones

Page 35: JavaScript para desarrolladores de C# Edin Kapić

Funciones de JavaScript• Son objetos, por tanto se les

pueden agregar propiedades• Se pueden pasar como

parámetros a otras funciones• Hay dos maneras de declarar

funciones

Page 36: JavaScript para desarrolladores de C# Edin Kapić

Manera 1: Declaración• La declaración de la función se

hace confunction foo() { /* .... */ }

• La función declarada hace “hoisting” y està disponible en todo el código JS, independientemente del orden de ejecución

http://jsfiddle.net/TQ6LG/

Page 37: JavaScript para desarrolladores de C# Edin Kapić

Manera 2: Expresión• También podemos asignar la función a

una variable mediante una expresión:var foo = function () { /* ... */ };

• En este caso no hay “hoisting”• Podemos pensar que una declaración es

realmente una expresión puesta al principio

http://jsfiddle.net/NrQhM/

Page 38: JavaScript para desarrolladores de C# Edin Kapić

Equivalencias• function foo() { /* .... */ }• var foo = function () { /* ... */ };• var foo = function foo () { /* ... */ };• var foo = function bar () { /* ... */ };

• Las dos últimas se usan para funciones recursivas• Las expresiones hacen explícita la declaración

Page 39: JavaScript para desarrolladores de C# Edin Kapić

Código de un solo uso (IIFE)• Podemos asignar una función

anónimamente y no recogerla como resultado

• Útil para ejecutar un código privado y de una sola vez

• (function () { /* ... */ })();http://jsfiddle.net/YAe9S/1/

Page 40: JavaScript para desarrolladores de C# Edin Kapić

Anidamiento de funciones• Las funcions son objetos y pueden

contener otras funciones

var foo = function() { function bar() { /* ... */ } return bar();};foo();

http://jsfiddle.net/XUswD/

Page 41: JavaScript para desarrolladores de C# Edin Kapić

Cierres (Closures)• El cierre es una manera de asociar la

función con sus parámetros de entrada– Es el mantenimiento de las variables

locales después de que la función haya acabado

var bind = function(x) { return function(y) { return x + y; };}var plus5 = bind(5); alert(plus5(3));

http://jsfiddle.net/xWAm4/

Page 42: JavaScript para desarrolladores de C# Edin Kapić

Recomendaciones• Dedicar tiempo para jugar con las

funciones en JS es imprescindible– Hay muchos ejemplos que se pueden

probar con JsFiddle

• Comprender los cierres es importante para entender los event handlers y encapsulamiento (http://jsfiddle.net/GBfPf/)

Page 43: JavaScript para desarrolladores de C# Edin Kapić

JavaScript en el siglo XXI

Page 44: JavaScript para desarrolladores de C# Edin Kapić

¿Vamos tirando?

Page 45: JavaScript para desarrolladores de C# Edin Kapić

¿O estamos al día?

Page 46: JavaScript para desarrolladores de C# Edin Kapić

Regla #1: Unobtrusive JavaScript

• El JS se tieen que añadir sin impactar el HTML de la página<input type="text" name="date“ onchange="validateDate()" />

window.onload = function() { document.getElementById('date').onchange = validateDate;};

Page 47: JavaScript para desarrolladores de C# Edin Kapić

Regla #2: Modularidad• No colisionar con otros

JS presentes (es decir, “comportarnos bien”)

• Encapsulemos nuestro código en namespaces

• Usemos try/catch

Page 48: JavaScript para desarrolladores de C# Edin Kapić

Métodos de encapsulamiento• Ninguno (objeto window)• Todo privado (función anónima auto-

ejecutada)

• Todo público (objeto literal)• Mezcla público/privado (Revealing

Module)

Page 49: JavaScript para desarrolladores de C# Edin Kapić

Objeto literalvar car = {    status: "off",    start: function() {        this.status = "on";    },    getStatus: function() {        return "the car is " + this.status;    }};car.start();alert(car.getStatus());

http://jsfiddle.net/DY2Zw/

Page 50: JavaScript para desarrolladores de C# Edin Kapić

Revealing Modulevar car = (function() { var pubCar = {}, var innerStatus = "off"; pubCar.start = function() { innerStatus = "on"; } pubCar.status = function() { return "the car is “ + innerStatus; } return pubCar;}());car.start();alert(car.status());

http://jsfiddle.net/AUzNT/

Page 51: JavaScript para desarrolladores de C# Edin Kapić

Recomendaciones• Usar Revealing Module para tenir el

encapsulamiento totalmente controlado por nosotros

• Aislarnos de otras librerías http://jsfiddle.net/uKuLw/

• Usar objetos literales para objetos sencillos (p.ej. DTOs)– La sintaxis es diferente

Page 52: JavaScript para desarrolladores de C# Edin Kapić

Regla #3: Abstracción• Nos abstraeremos de los detalles

del navegador concreto

• Existen librerías que unifican y abstraen las diferencias: jQuery, AmplifyJS, Modernizr

Page 53: JavaScript para desarrolladores de C# Edin Kapić

Microsoft TypeScript• Es un lenguaje basado en JavaScript• Añade la comprobación en tiempo

de compilación de referencias, tipos, clases e interfaces

• (Trans)compila a JavaScript “puro”• Disponible para VS2012• http://www.typescriptlang.org/

Page 54: JavaScript para desarrolladores de C# Edin Kapić

Resumen

Page 55: JavaScript para desarrolladores de C# Edin Kapić
Page 56: JavaScript para desarrolladores de C# Edin Kapić

Recomendaciones• Invertir tiempo en aprender los

principios de JS y experimentar con los ejemplos

• Repasar el código existente con JSHint

• Tener en cuenta las librerías de JS como factor arquitectónico en las aplicaciones

• JS está aquí para quedarse

Page 57: JavaScript para desarrolladores de C# Edin Kapić

Bibliografia• Douglas Crockford “JavaScript: The

Good Parts” (O’Reilly)• Addy Osmani “JavaScript Design

Patterns” http://bit.ly/bMyoQ9

• http://jsbooks.revolunet.com/ • http://superherojs.com

Page 58: JavaScript para desarrolladores de C# Edin Kapić