em javascript,
var a = '';
var b = (a) ? true : false;
var b
será definido como false
.
este é um comportamento definido em que se pode confiar?
javascript
string
boolean
cc jovem
fonte
fonte
false
aqui: jsfiddle.net/8CKbd''
é avaliada como falsa em um contexto booleano, então, sea = '';
entãoa ? false : true
=>'' ? false : true
=>false ? false : true
=>true
(porque é a avaliação de um valor falso). Eu acho que deveriavar b = (a) ? true : false;
estar correto com a próxima declaração.Respostas:
Sim. Javascript é um dialeto do ECMAScript, e a especificação da linguagem ECMAScript define claramente esse comportamento:
Citação de http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
fonte
new String("")
é verdade! Isso ocorre porque é um objeto, enquanto o formato abreviado""
representa a versão do valor primitivo. O mesmo vale paranew Number(0)
e aténew Boolean(false)
. É um bom motivo para não usar as versões do objeto no seu código, e isso significa queif (str.length)
lida com esse caso de borda, enquantoif (str)
não o faria.Sim. Todos
false
,0
, cadeias vazias''
e""
,NaN
,undefined
, enull
são sempre avaliadas comofalse
; tudo o resto étrue
.E no seu exemplo, b é
false
após a avaliação. (Eu acho que você escreveu por enganotrue
)fonte
null
não éfalse
, nemtrue
,null
énull
. jsfiddle.net/sq1Lkpg0NaN
eundefined
. Eles não são,false
mas são falsos. Qual foi o que foi perguntado.Como respondida acima, sim , que é o comportamento definido de uma cadeia vazia em uma condicional (uma
if
expressão,||
,&&
,? :
, ...). (O padrão diz que a operação ToBoolean interna deve ser aplicada.)A avaliação é diferente quando a cadeia vazia é usada em uma comparação (consulte Verdade, Igualdade e JavaScript ), mesmo que os resultados sejam basicamente os mesmos :
Explicação: Essencialmente, quando os operandos
==
têm tipos diferentes, o JavaScript tenta convertê-los em números, de acordo com seu valor ( usando operações que o padrão chama de ToNumber e ToPrimitive ) e, em seguida, aplica-se internamente===
. Mas quando você usa===
diretamente, os tipos não são convertidos; portanto, comparar uma String com um Boolean é semprefalse
.Grosso modo, as condicionais JavaScript ( ToBoolean ) testam um valor definido, não nulo, diferente de zero, não vazio e não falso (uma String vazia é ... vazia, os Números -0 ou +0 são ... zero, NaN não é um número definido, mas um objeto vazio aparentemente não é realmente vazia), ou como eu gosto de pensar, condicionais teste para um verdadeiro coisa () , enquanto que
==
compara os aparentes, cuidadosamente convertido valores ( ToPrimitive , tonumber ) de seus operandos e===
procura a semelhança exata .Há mais exemplos em Verdade, Igualdade e JavaScript, onde essa distinção realmente importa, por exemplo,
'0'
étrue
condicional (comprimento diferente de zero ou é uma coisa ), masfalse
em==
comparação (o valor é zero).'1'
novamente, étrue
nos dois casos (é uma coisa e tem um valor diferente de zero).fonte
var b
será definido comotrue
. Isso ocorre porque uma string vazia conta como um valor 'falsey' em JavaScript, assim como alguns outros valores.Consulte http://www.sitepoint.com/javascript-truthy-falsy/ para obter valores falsos
fonte
var b
na verdade será definido comotrue
porque é o oposto devar a
se você olhar para o código.fonte