O seguinte mostra que "0"
é falso em Javascript:
>>> "0" == false
true
>>> false == "0"
true
Então, por que o seguinte é impresso "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
falta de polaridade
fonte
fonte
"0"
é uma sequência e, como não está vazia, é avaliada como verdadeira."0" === false [...] false
'0'==false
mas '0' não é um valor Falsey (sim Javascript pode ser estranho)==
, eles nunca são convertidos em booleanos, portanto não se aplica. (As regras para a conversão parecem favorecer a conversão para números.)Respostas:
A razão é porque quando você faz explicitamente
"0" == false
, ambos os lados estão sendo convertidos em números, e , em seguida, a comparação é realizada.Quando você faz
if ("0") console.log("ha")
:, o valor da sequência está sendo testado. Qualquer string não vazia étrue
, enquanto uma string vazia éfalse
.fonte
Tabelas exibindo o problema:
e ==
Moral da história use ===
crédito de geração da tabela: https://github.com/dorey/JavaScript-Equality-Table
fonte
NaN
embora. Quero dizer,typeof NaN // number
masNaN === NaN // false
, hum ...NaN
, então quando você está comparando 2 NaNs, eles têm valores diferentes (eu acho). Leia a primeira citação aqui .==
nem===
operador para a[]
,{}
,[[]]
,[0]
e[1]
valores não avaliam para true. Quero dizer[] == []
e[] === []
também falso.Está de acordo com as especificações.
ToBoolean, de acordo com as especificações, é
E essa tabela diz isso sobre strings:
Agora, para explicar por que
"0" == false
você deve ler o operador de igualdade, que afirma que ele obtém seu valor da operação abstrataGetValue(lref)
corresponde ao mesmo para o lado direito.Que descreve esta parte relevante como:
Ou, em outras palavras, uma string tem uma base primitiva, que chama de volta o método get interno e acaba parecendo falsa.
Se você deseja avaliar coisas usando a operação GetValue
==
, se você deseja avaliar usando oToBoolean
, use===
(também conhecido como operador de igualdade "estrito")fonte
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Isso é verdade para todas as strings?Section 8.12.3: [[Get]] (P)
descreve como funciona. É verdade apenas para os casos em que a string é 0, pois realiza várias outras chamadas internas, resultando eventualmente emGetOwnProperty
que "o que quer que seja" seja uma propriedade de dados, que retornará todo esse valor. É por isso que "0" é falso e "blá" é verdadeiro. Confira alguns dos vídeos de Douglas Crockford no Yahoo developer theatre, ele descreve a "verdade" em JavaScript um pouco menos complexa do que eu. Se você entender o que "verdade" e "falsidade" significam, entenderá a resposta de Bobince imediatamente.É no PHP que a string
"0"
é falsa (false quando usado no contexto booleano). No JavaScript, todas as cadeias não vazias são verdadeiras.O truque é que,
==
contra um booleano não é avaliado em um contexto booleano, ele é convertido em número e, no caso de strings feitas pela análise como decimal. Então você obtém Number em0
vez da veracidade booleanatrue
.Esse é realmente um pouco pobre de design de linguagem e é uma das razões pelas quais tentamos não usar o infeliz
==
operador. Use em===
vez disso.fonte
fonte
Suas aspas ao redor do texto
0
tornam-no uma sequência, que é avaliada como verdadeira.Remova as aspas e deve funcionar.
fonte
É tudo por causa das especificações do ECMA ...
"0" == false
por causa das regras especificadas aqui http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Eif ('0')
avaliado como verdadeiro por causa das regras especificadas aqui http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5fonte
A expressão "if" testa a veracidade, enquanto a dupla é igual à equivalência independente do tipo. Uma string é sempre verdadeira, como outras pessoas apontaram aqui. Se o duplo igual estivesse testando ambos os operandos quanto à veracidade e depois comparando os resultados, você obteria o resultado que estava assumindo intuitivamente, ou seja
("0" == true) === true
. Como Doug Crockford diz em seu excelente JavaScript: the Good Parts , "as regras pelas quais [== força os tipos de seus operandos] são complicadas e imemoráveis ... A falta de transitividade é alarmante". Basta dizer que um dos operandos é coagido a combinar com o outro e que "0" acaba sendo interpretado como um zero numérico,fonte
== O operador de igualdade avalia os argumentos após convertê-los em números. Então seqüência zero "0" é convertido para o tipo de dados Número e boolean false é convertido em número 0. Assim,
O mesmo se aplica a `
=== A verificação rigorosa de igualdade avalia os argumentos com o tipo de dados original
O mesmo se aplica a
No
A String "0" não se compara a nenhum argumento, e a string é um valor verdadeiro até ou a menos que seja comparada com qualquer argumento. É exatamente como
Mas
`
fonte
Isso ocorre porque o JavaScript usa coerção de tipo em contextos booleanos e seu código
será coagido a ser verdadeiro em contextos booleanos.
Existem outros valores reais em Javascript que serão coagidos a verdade em contextos booleanos e, portanto, executam o bloco if:
fonte
coage x usando o toBoolean interno do JavaScript (http://es5.github.com/#x9.2)
coage ambos os lados usando coerção interna toNumber (http://es5.github.com/#x9.3) ou toPrimitive para objetos (http://es5.github.com/#x9.1)
Para obter detalhes completos, consulte http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
fonte