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.
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.
Você não deve usá-lo em números. Strings estão bem:
https://github.com/documentcloud/underscore/commit/79f65b440ad5e14ff2c624a836a3eff33465be9f
https://github.com/documentcloud/underscore/blob/322a64135dc3c4a649f102e962054310c2b39c04/underscore.js#L808
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);
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 :-)