Eu estava brincando no jsfiddle.net e estou curioso para saber por que isso retorna verdadeiro?
if(0 < 5 < 3) {
alert("True");
}
O mesmo acontece com isso:
if(0 < 5 < 2) {
alert("True");
}
Mas isso não acontece:
if(0 < 5 < 1) {
alert("True");
}
Essa peculiaridade é sempre útil?
javascript
compare
operators
boolean-logic
punkrockbuddyholly
fonte
fonte
Respostas:
A ordem das operações faz
(0 < 5 < 3)
com que seja interpretado em javascript como o((0 < 5) < 3)
que produz(true < 3)
e true é contado como 1, fazendo com que ele retorne true.É também por isso que
(0 < 5 < 1)
retorna false,(0 < 5)
retorna true, que é interpretado como1
resultando em(1 < 1)
.fonte
if(0 < 5 < 1) == false
. Tudo está claro agora, graças :)((0 < 5) && (5 < 3))
, pois provavelmente existem outras, mas eu não as conheço.Meu palpite é que
0 < 5
é verdade, etrue < 3
é lançado para o1 < 3
que é verdadeiro.fonte
provavelmente porque
true
é assumido como1
tãofonte
Porque
true < 3
porquetrue == 1
fonte
Quanto à sua pergunta sobre se essa peculiaridade é útil: suponho que possa haver algum caso em que seja útil (se for o que você procura depois de código condensado), mas confiar nele irá (muito provavelmente) reduzir drasticamente a compreensibilidade do seu código.
É como usar pós / pré-incremento / decremento como parte de expressões maiores. Você pode determinar rapidamente qual é o resultado desse código?
Nota: com esse código, às vezes você pode obter resultados diferentes dependendo do idioma e do compilador.
É uma boa idéia facilitar a vida para você e o próximo cara que lerá seu código. Escreva claramente o que você realmente quer que aconteça, em vez de depender de efeitos colaterais, como a conversão implícita de booleanos.
fonte
result
18 anos?A resposta para a segunda parte da pergunta "essa peculiaridade é sempre útil?" talvez não, como observado em uma resposta anterior, se é realmente uma peculiaridade da linguagem (Javascript) que true é convertido em 1, mas que o programador não vê em geral 1 e true (e 0 e false) como o mesma coisa.
Se, no entanto, você tem um modelo mental de 1 sendo verdadeiro e 0 sendo falso, isso leva a todo tipo de boas técnicas booleanas que são extremamente úteis, poderosas e diretas. Por exemplo, você pode incrementar um contador diretamente com o resultado de A> 100, o que aumentaria o contador se A for maior que 100. Essa técnica pode ser vista como uma peculiaridade ou um truque em Java, mas em uma matriz ou linguagem funcional pode ser idiomático.
Um exemplo clássico no idioma da matriz APL seria contar o número de itens em uma matriz que são (digamos) maiores que 100:
Onde A é a matriz de 5 itens 107 22 256 110 3, então:
gera a matriz booleana de 5 itens:
1 0 1 1 0
e somando esse resultado booleano:
produz a resposta final:
3
Esta pergunta é um exemplo perfeito de onde essa técnica seria muito útil, especialmente se o problema for generalizado para determinar se n de valores booleanos são verdadeiros.
Verifique se pelo menos dois de três booleanos são verdadeiros
fonte
Isso é fácil.
Comece da esquerda para a direita para avaliar o primeiro 0 <5. É verdade? Sim. Como TRUE = 1, ele avalia 1 <3. Como 1 é menor que 3, é verdade.
Agora com isso
0 é menor que 5? Sim. Portanto, torne VERDADEIRO o que também significa 1. Agora, com esse fato em mente, ele avalia como (1 <1). 1 é menor que 1? Não, portanto, é falso. Tem que ser igual.
fonte
está avaliando 0 <5 que retornaria 1 como verdadeiro quando 1 <3 que é verdadeiro?
C # quer que você faça isso "O operador '<' não pode ser aplicado a operandos do tipo 'bool' e 'int'"
fonte
Eu me deparei com isso há pouco tempo no Obj-C e fiquei muito intrigado com isso. Consegui os resultados desejados fazendo algo assim:
O que, obviamente, é falso, para que você não receba esse alerta "verdadeiro". Ainda bem que li isso, agora sei o porquê.
fonte
Além do python, o CoffeeScript é outra linguagem que suporta comparações encadeadas e, portanto,
3 < x < 10
seria convertida(3 < x && x < 10)
em JS vanillafonte
fonte
Um operando booleano quando operado sobre um operador matemático retorna um número. para verificar isso, fazemos
Portanto
0 < 5
, o booleano retornado (true) operado com o operador matemático (<) retornará um número. Então, ele chega a 1 <3, que retornatrue
fonte
porque 0 é menor que 5, então retorna true, e por padrão true é qualquer coisa que inclua e possa ser avaliado como 1, que ainda é menor que 3, que retorna novamente true
fonte
tente redigir seus resultados como Number ()
ou tente o seguinte:
Eu pesquisei isso porque estava recebendo
(3 >= 20) //returning true
e acho que o javascript estava tentando verificar3
como um booleano porque estava obtendo esse valor daelm.getAttribute();
função queconsole.log();
estava sendo impressa no formato String.fonte