¿Qué hace exactamente la función JavaScript anónima f => f?

101

Estoy usando una biblioteca de terceros que tiene una función que toma funciones como argumentos. Estoy haciendo algunas verificaciones condicionales para decidir si agregar o no una función en particular como parámetro y, en algunos casos, no quiero proporcionar una función. Proporcionar nulo en esos casos arroja un error.

Encontré este código que funciona, pero no entiendo completamente lo que está sucediendo.

compose(__DEV__ ? devTools() : f => f)

¿Es f => fequivalente a () => {}una función anónima vacía?

SomethingOn
fuente
3
Devuelve un objeto literal de f, según MDN
Eli Sadoff
4
no vacío anónimo, es identidad.
Davin Tryon
17
FWIW, a menudo puede pegar construcciones como esta en babel para ver cuáles son los equivalentes en versiones anteriores de ECMAscript.
James Thorpe
Esa respuesta a stackoverflow.com/questions/24900875/… no responde directamente a esta pregunta. Sabía que f => f era una función anónima, simplemente no entendía exactamente lo que estaba haciendo. Creo que esta pregunta es un caso específico y la información proporcionada por Felix King sobre las funciones de identidad es exclusiva de esta pregunta.
SomethingOn

Respuestas:

114

f => f es parecido a function(f){ return f; }

Tan cerca, pero no exactamente lo que esperabas.

* - como se ha señalado en los comentarios, existen diferencias sutiles, pero por el bien de su pregunta, no creo que sean particularmente relevantes. Son muy relevantes en otras situaciones.

Jamiec
fuente
2
Puedo pensar en al menos dos diferencias entre f => fy function(f) { return f; }:)
Benjamin Gruenbaum
6
@BenjaminGruenbaum genial, adelante, incluso actualiza esta respuesta si crees que es relevante.
Jamiec
4
No creo que sea muy relevante, solo un pedante: new (f => f)lanza, tiene un aspecto diferente toStringy por alguna razón no puedo asimilar los (f => f).argumentslanzamientos en Chrome pero no en FF o Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum el manejo thistambién es diferente. (aunque la diferencia podría no ser observable si thisno aparece en el cuerpo de la función ... no estoy seguro)
Gregory Nisbet
184

f => fes la función de identidad . Simplemente devuelve el argumento que se pasó.

Esta función se utiliza a menudo como valores predeterminados para los procesos de transformación, ya que no realiza ninguna transformación.

¿Es f => fequivalente a () => {}una función anónima vacía?

No. La función vacía no devuelve nada. La función de identidad devuelve el argumento pasado.

Felix Kling
fuente
43
A + por proporcionar nombre, explicación y un caso de uso, y responder la pregunta real.
Gracias
9

Otros ya han mencionado lo que f => fhace, así que no voy a profundizar en eso. Solo voy a explicar el resto de la función, porque hay una pequeña diferencia entre f => fy__DEV__ ? devTools() : f => f

El operador ternario comprueba si __DEV__es un valor verdadero y, si es así, devuelve la función devTools(). de lo contrario, devuelve la función de identidad f => fque no hace nada. Dicho de otra manera: este código habilita algunas funciones del modo de desarrollo. Sin el código restante, es difícil saber qué agrega este modo, pero presumiblemente permitirá cierta información de registro adicional y menos ofuscación.

Nzall
fuente
__DEV__ ? devTools() : f => fno asigna nada a f. ¿Dejó algo fuera del ejemplo de código?
Felix Kling
2
No devolverá la función, devolverá el resultado de la función
Stephan Bijzitter
1
Tu avatar me molesta y me perturba el día. Me siento como en los 90 y mi módem perdió la conexión. Aún así, +1 de todos modos, por una buena respuesta.
Konrad Viltersten
@KonradViltersten No eres el primero en comentar sobre mi avatar. Sin embargo, eres el primero al que no le gusta. La mayoría de la gente apreció el factor nostálgico y la pequeña subversión de expectativas que invoca.
Nzall
1
Espero que hayas captado la ironía, amigo. Fue pensado como una broma, por supuesto. Obviamente, me gusta y lo encuentro refrescantemente original.
Konrad Viltersten
9

En cualquier momento con un dilema similar, puede usar Babel para obtener la respuesta.

Regresó así:

"use strict";

(function (f) {
  return f;
});

Por cierto, => usaste la función ES6 llamada expresión de flecha . La otra expresión de interés

() => {};  // es6

se convertiría en:

(function () {});

Dado que las expresiones de función de flecha son siempre anónimas , tiene sentido si agrega el nombre a la función:

let empty = () => {}; // es6

se convertiría en

var empty = function empty() {}; 
prosti
fuente