function
y las arrow function
. Sin duda Javier ha dado en el clavo sobre una de las principales diferencias entre ambos modelos y pone de manifiesto la importancia de conocer que ambos modelos no son equivalentes e intercambiables, ya que el uso de uno u otro tiene consecuencias muy significativas en la contextualización de this
.Veamos cómo es posible saber si una función ha sido construida por medio de la instrucción function
o como una arrow function
. Es primer lugar debemos descartar algunas estrategias, que aunque parezcan evidentes, no van a funcionar en ningún caso:
var f = function () { return 1; }; var g = () => 1; console.log ( f === g, typeof (f) === typeof (g), f instanceof Function, g instanceof Function );
Todos estos intentos de comparar una función tradicional y una función flecha no ofrecen una solución válida. Tenemos dos métodos para conocer si una función ha sido construida de la forma tradicional o como función flecha:
Prototype
El primer método es preguntar por el prototipo de la función en cuestión. Las arrow function
no tienen prototipo y por lo tanto typeof
de esta propiedad devuelve el undefined
. Podemos aprovechar esta característica para escribir una breve y sencilla función isArrowFunction
:
function isArrowFunction(x) { return typeof x.prototype === 'undefined'; } var f = function () { return 1; }; var g = () => 1; console.log('isArrowFunction(f) = ', isArrowFunction(f)); console.log('isArrowFunction(g) = ', isArrowFunction(g));
Actualización: hemos visto que esta aproximación tiene un problema en varios casos: con las funciones nativas de los objetos Javascript y con los métodos de las clases, ya que estas tampoco tienen un prototipo y por lo tanto se confunden con las arrow function
si usamos esta función.
class C { m() {} } const c = new C(); console.log('isArrowFunction(Object.create) = ', isArrowFunction(Object.create)); console.log('isArrowFunction([].splice) = ', isArrowFunction([].splice)); console.log('isArrowFunction(c.m) = ', isArrowFunction(c.m));
toString
El segundo método es analizar el código de la función por medio del método toString()
que tienen todos los objetos en Javascript y, cómo las funciones también son objetos, podemos utilizar para las funciones y funciones flecha. Las funciones tradicionales empiezan siempre con el texto 'function'
y las funciones flecha no. Podemos aprovechar esta característica para rescribir nuestra función isArrowFunction
:
function isArrowFunction(x) { return x.toString().indexOf('function') !== 0; } var f = function () { return 1; }; var g = () => 1; console.log('isArrowFunction(f) = ', isArrowFunction(f)); console.log('isArrowFunction(g) = ', isArrowFunction(g));
Aunque no son evidentes, tenemos dos formas de conocer si una función ha sido construida de la forma tradicional o como función flecha, por lo que nuestras librerías o framework pueden establecer algún tipo de medida defensiva ante los comportamientos no deseados del uso de funciones flecha al no tener en cuenta el funcionamiento de this
en este tipo de funciones.
Novedades
HTTP2 para programadores. Enviar mensajes del servidor al cliente con Server Sent Event (sin WebSockets)
En esta charla, organizada por MadridJS, Pablo Almunia nos muestra cómo la mayoría de nosotros cuando oímos hablar por primera vez de HTTP2 nos ilusionamos con las posibilidades que presumiblemente se abrían para el desarrollo de soluciones web avanzadas y cómo muchos nos sentimos defraudados con lo que realmente se podía implementar.
En esta charla podemos ver cómo funciona el HTTP2, que debemos tener en cuenta en el servidor para hace uso de este protocolo y, sobre todo, cómo podemos enviar información desde el servidor al cliente de forma efectiva y fácil. Veremos con detenimiento cómo por medio de los Server-Sent Events (SSE) podemos recibir en el cliente datos enviados desde el servidor sin utilizar websocket, simplificando enormemente la construcción de aplicaciones con comunicación bidireccional.
Observables en Javascript con Proxies
En esta charla, organizada por MadridJS, Pablo Almunia nos habla de la observación reactiva de objetos en Javascript por medio de Proxy. Se describe paso a paso cómo funcionan los Proxies y en que casos pueden ser nuestro mejor aliado. Veremos que no hay que tenerles miedo, son bastante sencillos de utilizar, y nos ofrecen una gran abanico de posibilidades.
Aplicaciones JAMStack, SEO friendly y escalables con NextJS
En esta charla de Madrid JS, Rafael Ventura nos describe las funcionalidades clave de NextJS, nos muestra en vivo cómo desarrollar una completa aplicación JAMStack con Server Side Rendering (SSR) y Static Site Generation (SSG) y termina mostrando como publicar esta aplicación en Vercel.
Stencil JS: mejora el Time To Market de tu producto, por Rubén Aguilera
En esta charla Rubén Aguilera nos cuenta los problemas que tienen muchas empresas a la hora de sacar productos accesibles, vistosos y usables en el Time To Market que requiere Negocio y cómo podemos minimizar este tiempo gracias al DevUI con StencilJS para adecuar una aplicación de Angular a las exigencias del mercado en tiempo record.
Hola fantástico tip pero he probado en Babelio.js en el REPL y obtengo resultados contradictorios:
let f1 = () => 1;
let f2 = function f2(){ return 1;};
console.log(f1 === f2);
console.log(typeof(f1.prototype)); //[object]
console.log(typeof(f2.prototype)); //[object]
console.log(f1.toString()); //devuelven ambos lo mismo f1 y f2
console.log(f2.toString()); //idem
Puede ser por el transpiler?
Gracias
Sin duda alguna es un «problema» del transpiler, ya que simula el comportamiento de una arrow function, pero realmente no puede construir una. Este tipo de problema de los transpiler es el motivo por el que mucha gente decide no utilizarlos, pueden simular, pero no pueden hacer siempre una transformación con un comportamiento completamente equivalente.
Muchas gracias Javier, eso parece ser porque además he probado con otros temas de ES6 en Babel REPL y da errores o pasa por alto algunas cosas que no deberían de funcionar.
Gracias nuevamente.