¿Cuál es la convención de JavaScript para ninguna operación? Como un pass
comando de Python .
- Una opción es simplemente una función vacía:
function() {}
- jQuery ofrece
$.noop()
, que simplemente llama a la función vacía de arriba. - ¿Es aceptable simplemente ingresar un valor de
false
o0
?
En contexto ... todos estos funcionan sin arrojar un error en Chrome:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
EDITAR: Mucha gente respondió con "¡No hagas esto! ¡Cambia la estructura del código!" Esto me recuerda una publicación donde alguien preguntó cómo olfatear el navegador. Recibió un aluvión de publicaciones que decían: "¡NO HAGAS ESO! ES MALO", pero nadie le dijo cómo olfatear el navegador . Esta no es una revisión de código. Imagine que está tratando con un código heredado que no se puede cambiar, y sin alguna función pasada, arrojará un error. O, simplemente, así lo quiere el cliente y me está pagando . Entonces, respetuosamente, responda la pregunta : ¿Cuál es la mejor manera de especificar una función de "no operación" en JavaScript?
EDIT2: ¿Qué tal uno de estos?
true;
false;
0;
1;
null;
fuente
0
es efectivamente mejor (o peor). Yo diría que lo correcto esif (a === 1) doSomething();
no usarlo? :
cuando no tiene sentido.if (statement) action; else ;
false
o0
funcionará;null
es una buena forma de expresar no-op.Respuestas:
Para responder a la pregunta original, la implementación más elegante y ordenada de una función noop en Javascript puro (como también se discute aquí ) es Function.prototype . Esto es porque:
Aunque este es un "verdadero noop" ya que la mayoría de los navegadores parecen no hacer nada para ejecutar el noop definido de esta manera (y por lo tanto, ahorrar ciclos de CPU), puede haber algunos problemas de rendimiento asociados con esto (como también lo mencionan otros en los comentarios o en Otras respuestas).
Sin embargo, dicho esto, puede definir fácilmente su propia función noop y, de hecho, muchas bibliotecas y marcos también proporcionan funciones noop. A continuación se muestran algunos ejemplos:
Aquí hay una lista alfabética de varias implementaciones de funciones noop (o discusiones relacionadas o búsquedas en Google):
AngularJS 1.x , Angular 2+ (No parece tener una implementación nativa; use la suya propia como se muestra arriba), Ember , jQuery , Lodash , NodeJS , Ramda , React (No parece tener una implementación nativa; use la suya propia como se muestra arriba), RxJS , Underscore
LÍNEA INFERIOR : Aunque Function.prototype es una forma elegante de expresar un noop en Javascript, sin embargo, puede haber algunos problemas de rendimiento relacionados con su uso. Por lo tanto, puede definir y usar el suyo (como se muestra arriba) o usar uno definido por la biblioteca / marco que podría estar usando en su código.
fuente
Function.prototype()
si no necesita el tiempo de espera y desea que se ejecute de inmediato.setTimeout(Function(), 10000);
(( )=>{};)
técnicamente Pure JS y mucho más cortofunction () {}
pero exactamente equivalente.La más concisa y noop performant es una función de flecha vacía :
()=>{}
.Las funciones de flecha funcionan de forma nativa en todos los navegadores excepto IE (hay una transformación de babel si es necesario):
()=>{}
vs.Function.Prototype
()=>{}
es un 87% más rápido queFunction.prototype
en Chrome 67.()=>{}
es un 25% más rápido queFunction.prototype
en Firefox 60.()=>{}
es un 85% más rápido queFunction.prototype
en Edge (15/6/2018) .()=>{}
es 65% menos código queFunction.prototype
.La prueba a continuación se calienta usando la función de flecha para dar sesgo
Function.prototype
, pero la función de flecha es la clara ganadora:fuente
Function.prototype
es drásticamente más lento, pero ninguna de las otras opciones tiene una ventaja definida._=>{}
es un personaje menos y hace lo mismo._=>{}
tiene un solo parámetro. Si alguien está usando TypeScript con una configuración razonablemente estricta, eso no se compilaría. Si lo llama, su IDE probablemente le dirá que acepta un único parámetro que puede ser de cualquier tipo (tanto JavaScript como especialmente TypeScript en vscode).todo lo que tiendes a lograr aquí está mal. Las expresiones ternarias no se deben usar como una declaración completa, solo en expresión, por lo que la respuesta a su pregunta es:
ninguna de tus sugerencias, en su lugar haz lo siguiente:
entonces el código es fácilmente comprensible, legible y lo más eficiente posible.
¿Por qué hacerlo más difícil cuando puede ser simple?
editar:
Estás perdiendo mi punto. Todo lo anterior se trata de la expresión ternaria
x ? y : z
.Pero, un comando sin operación no tiene sentido en lenguajes de nivel superior como Javascript.
Por lo general, se usa, en lenguajes de nivel inferior, como ensamblador o C, como una forma de hacer que el procesador no haga nada por una instrucción con fines de temporización.
En JS, si lo hace
0;
,null;
,function () {};
o una declaración vacía, hay grandes posibilidades de que será ignorado por el intérprete cuando se está leyendo, pero antes de que se interpretó, así que al final, vas a ser su programa hacen cargado más lentamente por una cantidad de tiempo muy pequeña. Nota Bene : Asumo esto, ya que no estoy involucrado en ningún intérprete JS ampliamente utilizado, y hay posibilidades de que cada intérprete tenga su propia estrategia.En caso de que use algo un poco más complicado, como
$.noop()
ovar foo = function () {}; foo()
, entonces el intérprete puede hacer una llamada de función inútil que terminará estropeando algunos bytes de su pila de funciones y algunos ciclos.La única razón por la que veo una función como la
$.noop()
que existiría sería para poder seguir dando una función de devolución de llamada a alguna función de evento que arrojaría una excepción si no puede llamar a esa devolución de llamada. Pero entonces, es necesariamente una función que debe asignar, y darle elnoop
nombre es una buena idea, por lo que le está diciendo a sus lectores (y ese puede ser usted en 6 meses) que intencionalmente da una función vacía.Al final, no existe una estructura de código "inferior" o "superior". Tiene razón o no en la forma en que usa sus herramientas. Usar un ternario como ejemplo es como usar un martillo cuando quiere atornillar. Funcionará, pero no estás seguro de poder colgar algo en ese tornillo.
Lo que podría considerarse "inferior" o "superior" es el algoritmo y las ideas que pone en su código. Pero eso es otra cosa.
fuente
Creo que jQuery
noop()
está destinado principalmente a evitar que el código se bloquee al proporcionar una función predeterminada cuando la solicitada no está disponible. Por ejemplo, considerando el siguiente ejemplo de código,$.noop
se elige sifakeFunction
no está definido, evitando que sefn
bloquee la siguiente llamada a :Luego,
noop()
permite ahorrar memoria al evitar escribir la misma función vacía varias veces en cualquier lugar de su código. Por cierto,$.noop
es un poco más corto quefunction(){}
(6 bytes guardados por token). Entonces, no hay relación entre su código y el patrón de función vacío. Usenull
,false
o0
si lo desea, en su caso no habrá efectos secundarios. Además, vale la pena señalar que este código ...... es completamente inútil ya que nunca llamarás a la función, y esta ...
... es aún más inútil ya que llamas a una función vacía, que es exactamente lo mismo que ...
Reemplacemos la expresión ternaria con una
if
declaración para ver cuánto es inútil:Simplemente podría escribir:
O incluso más corto:
Para finalmente responder a su pregunta, supongo que una "no operación convencional" es la que nunca se escribe.
fuente
mypromise.then($.noop, myErrorhandler);
Yo suelo:
Para probar el tiempo de ejecución de esta ejecución como:
resultado: marca: 0.000ms
El uso
Boolean( 10 > 9)
se puede reducir a simplemente lo( 10 > 9)
que devuelvetrue
. Se me ocurrió la idea de usar un solo operando que esperaba(0);
que regresarafalse
, pero simplemente devuelve el argumento, ya que se puede revisar realizando esta prueba en la consola.fuente
argument 0 is not a function
noop
debería ser una función que evalúe conundefined
resultado.function(){}
como una solución. Llamar(0)()
causaráTypeError: 0 is not a function
var a = (0);
. Una operación no operativa no debería cambiar la memoria y su ejemplo de asignación hace precisamente eso. El(0)
por sí solo puede considerarse un no-op inútil (hay un número infinito de estos en JavaScript, por lo que no hay nada que haga que su ejemplo aquí sea especial).No hay absolutamente ningún problema o penalización de rendimiento por usar
Function.prototype
over() => {}
.El principal beneficio
Function.prototype
es tener una función singleton en lugar de redefinir una nueva función anónima cada vez. Es especialmente importante usar un tipo noFunction.prototype
operativo al definir valores predeterminados y memorizar, ya que le brinda un puntero de objeto consistente que nunca cambia.La razón por la que recomiendo en
Function.prototype
lugar deFunction
es porque no son lo mismo:También, puntos de referencia de otras respuestas son engañosos . De hecho,
Function.prototype
funciona más rápido que() => {}
dependiendo de cómo escriba y ejecute el punto de referencia:No puede confiar en los puntos de referencia de JS << Específicamente llamando a los puntos de referencia en esta pregunta.
No diseñe su código a partir de puntos de referencia; haga todo lo que se pueda mantener y deje que el intérprete descubra cómo optimizar a largo plazo.
fuente