Quelle est la convention JavaScript pour aucune opération? Comme une pass
commande Python .
- Une option est simplement une fonction vide:
function() {}
- jQuery propose
$.noop()
, qui appelle simplement la fonction vide ci-dessus. - Est-il acceptable d'entrer simplement une valeur de
false
ou0
?
Dans le contexte ... tout cela fonctionne sans générer d'erreur dans Chrome:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
EDIT: Beaucoup de gens ont répondu: "Ne faites pas ça! Changez la structure du code!" Cela me rappelle un article où quelqu'un a demandé comment renifler le navigateur. Il a reçu une avalanche de messages disant: "NE FAITES PAS CELA! C'EST MAUVAIS", mais personne ne lui a dit comment renifler le navigateur . Ce n'est pas une révision de code. Imaginez que vous avez affaire à du code hérité qui ne peut pas être modifié, et sans une fonction transmise, il lancera une erreur. Ou, tout simplement, c'est ainsi que le client le souhaite et il me paie . Donc, respectueusement, veuillez répondre à la question : Quelle est la meilleure façon de spécifier une fonction «sans opération» en JavaScript?
EDIT2: Que diriez-vous de l'un d'entre eux?
true;
false;
0;
1;
null;
la source
0
n'est effectivement meilleure (ou pire). Je dirais que la bonne chose à faire est deif (a === 1) doSomething();
ne pas utiliser? :
lorsque cela n'a pas de sens.if (statement) action; else ;
false
ou0
fonctionnera;null
est une belle façon d'exprimer le no-op.Réponses:
Pour répondre à la question originale, l'implémentation la plus élégante et la plus soignée d'une fonction noop en Javascript pur (comme cela est également discuté ici ) est Function.prototype . Ceci est dû au fait:
Bien que ce soit un "vrai noop" puisque la plupart des navigateurs semblent ne rien faire pour exécuter le noop défini de cette façon (et donc économiser les cycles CPU), il peut y avoir des problèmes de performances associés à cela (comme cela est également mentionné par d'autres dans les commentaires ou dans autres réponses).
Cependant, cela étant dit, vous pouvez facilement définir votre propre fonction noop et, en fait, de nombreuses bibliothèques et frameworks fournissent également des fonctions noop. Voici quelques exemples:
Voici une liste alphabétique des différentes implémentations des fonctions noop (ou des discussions associées ou des recherches Google):
AngularJS 1.x , Angular 2+ (ne semble pas avoir d'implémentation native - utilisez la vôtre comme indiqué ci-dessus), Ember , jQuery , Lodash , NodeJS , Ramda , React (ne semble pas avoir d'implémentation native - utilisez la vôtre comme indiqué ci-dessus), RxJS , Underscore
BOTTOM LINE : Bien que Function.prototype soit une manière élégante d'exprimer un noop en Javascript, cependant, il peut y avoir des problèmes de performances liés à son utilisation. Ainsi, vous pouvez définir et utiliser le vôtre (comme indiqué ci-dessus) ou en utiliser un défini par la bibliothèque / le framework que vous pourriez utiliser dans votre code.
la source
Function.prototype()
si vous n'avez pas besoin du délai et que vous voulez qu'il s'exécute immédiatement.setTimeout(Function(), 10000);
(( )=>{};)
techniquement Pure JS et beaucoup plus court quefunction () {}
mais exactement équivalent.Le plus concis et noop est une performante fonction vide flèche :
()=>{}
.Les fonctions fléchées fonctionnent nativement dans tous les navigateurs sauf IE (il y a une transformation babel si vous devez):
()=>{}
contre.Function.Prototype
()=>{}
est 87% plus rapide queFunction.prototype
dans Chrome 67.()=>{}
est 25% plus rapide queFunction.prototype
dans Firefox 60.()=>{}
est 85% plus rapide queFunction.prototype
dans Edge (15/06/2018) .()=>{}
est 65% moins de code queFunction.prototype
.Le test ci-dessous se réchauffe en utilisant la fonction de flèche pour donner un biais
Function.prototype
, mais la fonction de flèche est clairement gagnante:la source
Function.prototype
est considérablement plus lent, mais aucune des autres options ne présente un avantage certain._=>{}
est un caractère de moins et fait la même chose._=>{}
a un seul paramètre. Si quelqu'un utilise TypeScript avec une configuration raisonnablement stricte, cela ne compilerait pas. Si vous l'appelez, votre IDE vous dira probablement qu'il accepte un seul paramètre qui peut être de n'importe quel type (à la fois JavaScript et surtout TypeScript dans vscode).tout ce que vous avez tendance à réaliser ici est faux. Les expressions ternaires ne doivent pas être utilisées comme une déclaration complète, seulement dans l'expression, donc la réponse à votre question est:
aucune de vos suggestions, faites plutôt:
alors le code est facilement compréhensible, lisible et aussi efficace que possible.
Pourquoi rendre cela plus difficile, alors que cela peut être simple?
Éditer:
Vous manquez mon point. Tout ce qui précède concerne l'expression ternaire
x ? y : z
.Mais, une commande sans opération n'a pas de sens dans les langages de niveau supérieur tels que Javascript.
Il est généralement utilisé, dans des langages de niveau inférieur tels que l'assembly ou C, pour que le processeur ne fasse rien pour une instruction à des fins de synchronisation.
Dans JS, si vous le faites
0;
,null;
,function () {};
ou une déclaration vide, il y a de grandes chances qu'il sera ignoré par l'interprète quand il est en train de lire, mais avant qu'il est interprété, donc à la fin, vous allez juste faire votre programme soit chargé plus lentement par une très petite quantité de temps. Nota Bene : Je suppose cela, car je ne suis impliqué dans aucun interpréteur JS largement utilisé, et il y a des chances que chaque interprète ait sa propre stratégie.Si vous utilisez quelque chose d'un peu plus compliqué, comme
$.noop()
ouvar foo = function () {}; foo()
, alors l'interpréteur peut faire un appel de fonction inutile qui finira par gâcher quelques octets de votre pile de fonctions, et quelques cycles.La seule raison pour laquelle je vois une fonction telle
$.noop()
qu'elle existerait, serait de pouvoir toujours donner une fonction de rappel à une fonction d'événement qui lèverait une exception si elle ne peut pas appeler ce rappel. Mais alors, c'est forcément une fonction que vous devez donner, et lui donner lenoop
nom est une bonne idée donc vous dites à vos lecteurs (et cela peut être vous dans 6 mois) que vous donnez volontairement une fonction vide.En fin de compte, il n'y a pas de structure de code «inférieure» ou «supérieure». Vous avez raison ou tort dans la façon dont vous utilisez vos outils. Utiliser un ternaire pour votre exemple, c'est comme utiliser un marteau lorsque vous voulez visser. Cela fonctionnera, mais vous n'êtes pas sûr de pouvoir accrocher quelque chose à cette vis.
Ce qui peut être considéré comme "inférieur" ou "supérieur" est l'algorithme et les idées que vous mettez dans votre code. Mais c'est autre chose.
la source
Je pense que jQuery
noop()
est principalement destiné à empêcher le code de planter en fournissant une fonction par défaut lorsque celle demandée n'est pas disponible. Par exemple, en considérant l'exemple de code suivant,$.noop
est choisi sifakeFunction
n'est pas défini, ce qui empêche le prochain appel àfn
de se bloquer:Ensuite,
noop()
permet d'économiser de la mémoire en évitant d'écrire la même fonction vide plusieurs fois partout dans votre code. À propos,$.noop
est un peu plus court quefunction(){}
(6 octets enregistrés par jeton). Il n'y a donc aucune relation entre votre code et le modèle de fonction vide. Utiliseznull
,false
ou0
si vous le souhaitez, dans votre cas, il n'y aura aucun effet secondaire. De plus, il convient de noter que ce code ...... est complètement inutile puisque vous n'appellerez jamais la fonction, et celle-ci ...
... est d'autant plus inutile que vous appelez une fonction vide, qui est exactement la même chose que ...
Remplaçons l'expression ternaire par une
if
instruction pour voir à quel point c'est inutile:Vous pouvez simplement écrire:
Ou encore plus court:
Pour enfin répondre à votre question, je suppose qu'une "opération non conventionnelle" est celle qui n'est jamais écrite.
la source
mypromise.then($.noop, myErrorhandler);
J'utilise:
Pour tester le temps d'exécution de cette exécution comme suit:
résultat: marque: 0.000ms
L'utilisation
Boolean( 10 > 9)
peut se réduire simplement à( 10 > 9)
quels retourstrue
. L'idée d'utiliser un seul opérande auquel je m'attendais(0);
seraitfalse
renvoyée, mais elle renvoie simplement l'argument comme on peut le revoir en effectuant ce test sur la console.la source
argument 0 is not a function
noop
devrait être une fonction qui évalue avec leundefined
résultat.function(){}
comme solution. L'appel(0)()
provoqueraTypeError: 0 is not a function
var a = (0);
. Un no-op ne devrait pas changer la mémoire et votre exemple d'affectation fait exactement cela. Le(0)
seul peut être considéré comme un no-op inutile (il y en a un nombre infini dans JavaScript donc il n'y a rien qui rend votre exemple spécial ici).Il n'y a absolument pas de pénalité problème ou la performance de l' utilisation de
Function.prototype
plus() => {}
.Le principal avantage
Function.prototype
est d'avoir une fonction singleton plutôt que de redéfinir une nouvelle fonction anonyme à chaque fois. Il est particulièrement important d'utiliser un no-op commeFunction.prototype
lors de la définition des valeurs par défaut et de la mémorisation car cela vous donne un pointeur d'objet cohérent qui ne change jamais.La raison pour laquelle je recommande
Function.prototype
plutôt queFunction
c'est parce qu'ils ne sont pas les mêmes:De plus, les repères d'autres réponses sont trompeurs . En fait,
Function.prototype
fonctionne plus rapidement que() => {}
selon la façon dont vous écrivez et exécutez le benchmark:Vous ne pouvez pas faire confiance aux benchmarks JS << Appeler spécifiquement des benchmarks sur cette question.
Ne stylisez pas votre code à partir de benchmarks; faites tout ce qui est maintenable et laissez l'interprète déterminer comment optimiser à long terme.
la source