var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
será definido como true
.
este é um comportamento definido em que se pode confiar?
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 :
// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length => false
// comparisons
console.log('' == true); // +0 === 1 => false
console.log('' == false); // +0 === +0 => true
console.log('' === true); // different types => false
console.log('' === false); // different types => false
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 é sempre false
.
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 .
if (X) {} // is X a (true) thing?
if (X == Y) {} // are the values of X and Y same-ish?
if (X === Y) {} // are X and Y exactly the same?
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 ), mas false
em ==
comparação (o valor é zero). '1'
novamente, é true
nos dois casos (é uma coisa e tem um valor diferente de zero).
console.log('' ? true : false); // zero length => false
console.log('' == true); // +0 === 1 => false
console.log('0' ? true : false); // non-zero length => true
console.log('0' == true); // +0 === 1 => false
console.log('1' ? true : false); // non-zero length => true
console.log('1' == true); // 1 === 1 => true
false
aqui: jsfiddle.net/8CKbd