58
JavaScript para desarrolladores de C# Edin Kapić

JavaScript para desarrolladores de C#

  • Upload
    truda

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

JavaScript para desarrolladores de C#. Edin Kapi ć. JavaScript. !=. C#. Edin Kapi ć. JavaScript : “ With or Without You ”. Brendan Eich “El padre de la criatura”. ¿ Cómo llegamos hasta aquí?. 1996 Internet Explorer 3.0 JScript. 1997 ECMAScript. 1995 Netscape Navigator 2.0 - PowerPoint PPT Presentation

Citation preview

Page 1: JavaScript  para  desarrolladores  de C#

JavaScript para desarrolladores de C#

Edin Kapić

Page 2: JavaScript  para  desarrolladores  de C#

JavaScript

Edin KapićC#!=

Page 3: JavaScript  para  desarrolladores  de C#

JavaScript: “With or Without You”

Brendan Eich“El padre de la

criatura”

Page 4: JavaScript  para  desarrolladores  de C#

¿Cómo llegamos hasta aquí?

1995Netscape Navigator

2.0Mocha/LiveScript

1996Internet Explorer

3.0JScript

1997ECMAScript

Page 5: JavaScript  para  desarrolladores  de C#

1999XMLHttpRequest(OWA Exchange

2000)

2005Jesse James

GarrettAJAX

2006John Resig

jQuery

Page 6: JavaScript  para  desarrolladores  de C#

2009PhoneGap

2010Node.js

2011Windows 8

2012SharePoint 2013

TypeScript

TypeScript

Page 7: JavaScript  para  desarrolladores  de C#

Hay que saltar de una vez

Page 8: JavaScript  para  desarrolladores  de C#

JsFiddle

Firebug / IE Dev Tools

JSLintJSHint

Las herramientasFirebugLite

Page 9: JavaScript  para  desarrolladores  de C#

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#

... 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#

JavaScript != C#

Page 12: JavaScript  para  desarrolladores  de C#

• 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#

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#

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

Complejos• Object• Array• Function• RegExp• Date

Page 15: JavaScript  para  desarrolladores  de C#

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#

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#

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#

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#

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#

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#

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#

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

objetos de JS

Page 23: JavaScript  para  desarrolladores  de C#

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

Page 24: JavaScript  para  desarrolladores  de C#

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

Page 25: JavaScript  para  desarrolladores  de C#

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

Page 26: JavaScript  para  desarrolladores  de C#

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

Page 27: JavaScript  para  desarrolladores  de C#

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

Page 28: JavaScript  para  desarrolladores  de C#

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#

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#

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#

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#

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#

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#

Funciones

Page 35: JavaScript  para  desarrolladores  de C#

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#

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#

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#

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#

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#

Anidamiento de funciones• Las funcions son objetos y pueden

contener otras funcionesvar foo = function() { function bar() { /* ... */ } return bar();};foo(); http://jsfiddle.net/XUswD/

Page 41: JavaScript  para  desarrolladores  de C#

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 acabadovar 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#

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#

JavaScript en el siglo XXI

Page 44: JavaScript  para  desarrolladores  de C#

¿Vamos tirando?

Page 45: JavaScript  para  desarrolladores  de C#

¿O estamos al día?

Page 46: JavaScript  para  desarrolladores  de C#

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#

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#

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#

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#

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#

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#

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#

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#

Resumen

Page 55: JavaScript  para  desarrolladores  de C#
Page 56: JavaScript  para  desarrolladores  de C#

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#

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#