Underscore: _.isEmpty Comportamento em números

Criado em 13 jan. 2012  ·  13Comentários  ·  Fonte: jashkenas/underscore

var cow = {a: 1, b: {}, c: []};
_.isEmpty(cow); // returns false

isEmpty funciona bem em objetos que contêm números como os únicos valores 'não vazios'

_.isEmpty(cow.a); // returns true

No entanto, o k, v individual de a: 1 é considerado vazio.

Eu li os problemas e observei que, originalmente, _.isEmpty não se destinava a strings, então isso pode ser intencional. Se não for esse o caso, tenho um branch para o qual posso fazer uma solicitação de pull.

question

Comentários muito úteis

Bem, sim. Estou feliz que você perguntou :-)

A forma como vi a maioria das pessoas usar _.isEmpty é basicamente para verificar se um valor (qualquer valor) foi atribuído a uma variável específica. Tenho visto muitos desenvolvedores enfrentarem problemas por causa disso.

Até mesmo a documentação oficial afirma "Retorna verdadeiro se o objeto não contiver valores" - e um número deve ser qualificado como um valor.

Se houver algum tipo de implicação maior em fazer essa mudança que simplesmente não consigo ver, minha segunda melhor sugestão seria atualizar a documentação para afirmar claramente que ela não deve ser usada para números :-)

Todos 13 comentários

O caso de uso que encontrei estava fazendo algo assim

_.each(cow, function(v, k) {
  if (_.isEmpty(v)) {
    // do something with k because of v being empty
  }
});

Portanto, cow.a seria tratado como cow.b e cow.c. Posso codificar em torno dele, mas pensei que seria muito mais puro se não precisasse (e se não quebrasse o espírito ou a visão do sublinhado)

Sim, _.isEmpty só é definido para objetos e arrays. Você não deve usá-lo em strings ou números.

Então, quais alternativas temos que usar nos números?

@jashkenas ou @michaelficarra: qualquer razão especial _.isNumber não é chamado com no _.isEmpty ? (da mesma forma que _.isArray e _.isString estão sendo usados)

Alguma razão para isso?

Bem, sim. Estou feliz que você perguntou :-)

A forma como vi a maioria das pessoas usar _.isEmpty é basicamente para verificar se um valor (qualquer valor) foi atribuído a uma variável específica. Tenho visto muitos desenvolvedores enfrentarem problemas por causa disso.

Até mesmo a documentação oficial afirma "Retorna verdadeiro se o objeto não contiver valores" - e um número deve ser qualificado como um valor.

Se houver algum tipo de implicação maior em fazer essa mudança que simplesmente não consigo ver, minha segunda melhor sugestão seria atualizar a documentação para afirmar claramente que ela não deve ser usada para números :-)

Por que você iria querer passar um número para isEmpty , em vez de apenas verificar se o número é nulo?

Até mesmo a documentação oficial afirma "Retorna verdadeiro se o objeto não contiver valores"

Muito bem. Em JavaScript, um número (infelizmente) não é um objeto.

Acho que isso poderia ser resolvido com ajustes de _.isEmpty doc. O que os desenvolvedores estão procurando é _.exists .

Faz sentido para _.isEmpty(a) significar "é a um objeto vazio?", Mais ou menos como se a instrução: if obj == {} funcionasse em valores e não em referências. Portanto, valores como números retornariam falso e, portanto, seriam nulos e indefinidos.

um exemplo de implementação de _.isEmpty pode ser:

_.isEmpty = function(a) {
  return _.isEqual(a, {}) || _.isEqual(a, []) || _.isEqual(a, '');
}

@jashkenas Provavelmente porque em algumas outras linguagens "vazio" determina se a variável está vazia ou não :) http://www.php.net/manual/en/function.empty.php

+1 para @josser - principalmente porque tenho experiência em PHP :-p
Mas acho que apenas esclarecer isso na documentação também pode ser suficiente. Sério, vejo que as pessoas se deparam com isso a cada duas semanas.

Eu encontrei isso hoje .. Eu estava usando com _.omit

_.omit(someObject, _.isEmpty);
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sky0014 picture sky0014  ·  8Comentários

arypbatista picture arypbatista  ·  3Comentários

Francefire picture Francefire  ·  5Comentários

afranioce picture afranioce  ·  8Comentários

arieljake picture arieljake  ·  4Comentários