Qual é a convenção de JavaScript para nenhuma operação? Como um pass
comando Python .
- Uma opção é simplesmente uma função vazia:
function() {}
- jQuery oferece
$.noop()
, que simplesmente chama a função vazia acima. - É aceitável simplesmente inserir um valor de
false
ou0
?
No contexto ... tudo isso funciona sem gerar um erro no 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: Muitas pessoas responderam com: "não faça isso! Mude a estrutura do código!" Isso me lembra de uma postagem em que alguém perguntou como farejar o navegador. Ele recebeu uma enxurrada de postagens dizendo: "NÃO FAÇA ISSO! É MAL", mas ninguém lhe disse como farejar o navegador . Esta não é uma revisão de código. Imagine que você esteja lidando com um código legado que não pode ser alterado e, sem alguma função transmitida, ele apresentará um erro. Ou, simplesmente, é assim que o cliente deseja e está me pagando . Portanto, respeitosamente, responda à pergunta : Qual é a melhor maneira de especificar uma função "sem operação" em JavaScript?
EDIT2: Que tal um desses?
true;
false;
0;
1;
null;
fonte
0
é efetivamente melhor (ou pior). Eu diria que a coisa certa a fazer éif (a === 1) doSomething();
e não usar? :
quando não fizer sentido.if (statement) action; else ;
false
ou0
funcionará;null
é uma boa maneira de expressar no-op.Respostas:
Para responder à pergunta original, a implementação mais elegante e organizada de uma função noop em Javascript puro (como também é discutido aqui ) é Function.prototype . Isto é porque:
Embora este seja um "noop verdadeiro", uma vez que a maioria dos navegadores parece não fazer nada para executar o noop definido desta forma (e, portanto, salvar os ciclos da CPU), pode haver alguns problemas de desempenho associados a isso (como também é mencionado por outros em comentários ou em outras respostas).
No entanto, dito isso, você pode definir facilmente sua própria função noop e, de fato, muitas bibliotecas e estruturas também fornecem funções noop. Abaixo estão alguns exemplos:
Aqui está uma lista em ordem alfabética de várias implementações de funções noop (ou discussões relacionadas ou pesquisas no Google):
AngularJS 1.x , Angular 2+ (não parece ter uma implementação nativa - use a sua própria como mostrado acima), Ember , jQuery , Lodash , NodeJS , Ramda , React (não parece ter uma implementação nativa - use a sua como mostrado acima), RxJS , sublinhado
CONCLUSÃO : Embora Function.prototype seja uma maneira elegante de expressar um noop em Javascript, no entanto, pode haver alguns problemas de desempenho relacionados ao seu uso. Portanto, você pode definir e usar o seu próprio (como mostrado acima) ou usar um definido pela biblioteca / estrutura que você pode estar usando em seu código.
fonte
Function.prototype()
se usar até mesmo se você não precisar do tempo limite e quiser que ele seja executado imediatamente.setTimeout(Function(), 10000);
(( )=>{};)
tecnicamente Pure JS e muito mais curto do que,function () {}
mas exatamente equivalente.O mais concisa e noop performance é uma função seta vazia :
()=>{}
.As funções de seta funcionam nativamente em todos os navegadores, exceto no IE (há uma transformação babel, se necessário):
()=>{}
vs.Function.Prototype
()=>{}
é 87% mais rápido do queFunction.prototype
no Chrome 67.()=>{}
é 25% mais rápido do queFunction.prototype
no Firefox 60.()=>{}
é 85% mais rápido do queFunction.prototype
no Edge (15/06/2018) .()=>{}
é 65% menos código do queFunction.prototype
.O teste abaixo esquenta usando a função de seta para dar um viés
Function.prototype
, mas a função de seta é a vencedora:fonte
Function.prototype
é drasticamente mais lento, mas nenhuma das outras opções tem uma vantagem definitiva._=>{}
é um personagem a menos e faz a mesma coisa._=>{}
tem um único parâmetro. Se alguém estiver usando o TypeScript com uma configuração razoavelmente estrita, isso não será compilado. Se você chamá-lo, seu IDE provavelmente dirá que aceita um único parâmetro que pode ser de qualquer tipo (JavaScript e, especialmente, TypeScript em vscode).tudo o que você tende a conseguir aqui está errado. As expressões ternárias não devem ser usadas como uma declaração completa, apenas na expressão, portanto, a resposta à sua pergunta é:
nenhuma de suas sugestões, em vez disso:
então o código é facilmente compreensível, legível e tão eficiente quanto possível.
Por que tornar mais difícil, quando pode ser simples?
editar:
Você está perdendo o meu ponto. Tudo o que foi dito acima é sobre a expressão ternária
x ? y : z
.Porém, um comando no operation não faz sentido em linguagens de nível superior, como Javascript.
Geralmente é usado, em linguagens de nível inferior, como assembly ou C, como uma maneira de fazer o processador não fazer nada por uma instrução para fins de temporização.
Em JS, se você faz
0;
,null;
,function () {};
ou uma declaração vazia, há grandes chances de que ele será ignorado pelo intérprete quando ele é lê-lo, mas antes que ele obtém interpretado, assim, no final, você só vai fazer o seu programa ser carregado mais lentamente por um período de tempo muito pequeno. Nota Bene : Estou supondo isso, pois não estou envolvido em nenhum interpretador JS amplamente usado e há chances de cada interpretador ter sua própria estratégia.No caso de você usar algo um pouco mais complicado, como
$.noop()
ouvar foo = function () {}; foo()
, então o interpretador pode fazer uma chamada de função inútil que acabará estragando alguns bytes de sua pilha de funções e alguns ciclos.A única razão pela qual vejo uma função como
$.noop()
existiria seria para ainda ser capaz de fornecer uma função de retorno de chamada para alguma função de evento que lançaria uma exceção se não pudesse chamar esse retorno de chamada. Mas então, é necessariamente uma função que você precisa fornecer, e dar a ela onoop
nome é uma boa ideia, então você está dizendo aos seus leitores (e isso pode ser você em 6 meses) que você atribuiu uma função vazia de propósito.No final das contas, não existe estrutura de código "inferior" ou "superior". Você está certo ou errado na maneira como usa suas ferramentas. Usar um ternário como exemplo é como usar um martelo para aparafusar. Vai funcionar, mas você não tem certeza de que pode pendurar algo nesse parafuso.
O que pode ser considerado "inferior" ou "superior" é o algoritmo e as ideias que você colocou em seu código. Mas isso é outra coisa.
fonte
Acho que o
noop()
objetivo principal do jQuery é impedir o código de travar, fornecendo uma função padrão quando a solicitada não está disponível. Por exemplo, considerando o seguinte exemplo de código,$.noop
é escolhido sefakeFunction
não estiver definido, evitando que a próxima chamada parafn
travar:Em seguida,
noop()
permite economizar memória evitando escrever a mesma função vazia várias vezes em todo o código. A propósito,$.noop
é um pouco menor quefunction(){}
(6 bytes salvos por token). Portanto, não há relacionamento entre o seu código e o padrão de função vazio. Usenull
,false
ou0
se quiser, no seu caso não haverá efeito colateral. Além disso, é importante notar que este código ...... é completamente inútil já que você nunca chamará a função, e esta ...
... é ainda mais inútil, pois você chama uma função vazia, que é exatamente o mesmo que ...
Vamos substituir a expressão ternária por uma
if
declaração para ver o quanto é inútil:Você pode simplesmente escrever:
Ou ainda mais curto:
Para finalmente responder à sua pergunta, acho que "nenhuma operação convencional" é aquela que nunca é escrita.
fonte
mypromise.then($.noop, myErrorhandler);
Eu uso:
Para testar o tempo de execução desta execução como:
resultado: marca: 0,000ms
O uso
Boolean( 10 > 9)
pode ser reduzido a simplesmente o( 10 > 9)
que retornatrue
. Tendo a ideia de usar um único operando que eu esperava totalmente,(0);
ele retornariafalse
, mas ele simplesmente retorna o argumento, conforme pode ser revisado executando este teste no console.fonte
argument 0 is not a function
noop
deve ser uma função que avalia comundefined
resultado.function(){}
como uma solução. Chamar(0)()
causaráTypeError: 0 is not a function
var a = (0);
. Um ambiente autônomo não deve mudar a memória e seu exemplo de atribuição faz exatamente isso. O(0)
por si só pode ser considerado um ambiente autônomo inútil (há um número infinito deles em JavaScript, então não há nada que torne seu exemplo especial aqui).Não há absolutamente nenhum problema ou desempenho penalidade de usar
Function.prototype
mais() => {}
.O principal benefício
Function.prototype
é ter uma função singleton em vez de redefinir uma nova função anônima a cada vez. É especialmente importante usar umFunction.prototype
ambiente autônomo ao definir valores padrão e memoizing, pois ele fornece um ponteiro de objeto consistente que nunca muda.O motivo pelo qual estou recomendando,
Function.prototype
e nãoFunction
porque eles não são iguais:Além disso, os benchmarks de outras respostas são enganosos . Na verdade, tem um
Function.prototype
desempenho mais rápido do que() => {}
dependendo de como você escreve e executa o benchmark:Você não pode confiar nos benchmarks JS << Referindo especificamente os benchmarks nesta questão.
Não estilize seu código a partir de benchmarks; faça tudo o que for passível de manutenção e deixe o interpretador descobrir como otimizar a longo prazo.
fonte