Eu tive que escrever uma rotina que incrementa o valor de uma variável em 1 se seu tipo é number
e atribui 0 à variável, se não, onde a variável é inicialmente null
ou undefined
.
A primeira implementação foi v >= 0 ? v += 1 : v = 0
porque pensei que qualquer coisa que não fosse um número tornaria uma expressão aritmética falsa, mas estava errada, pois null >= 0
é avaliada como verdadeira. Aprendi então que null
se comporta como 0 e as seguintes expressões são avaliadas como verdadeiras.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Obviamente, null
não null == 0
é 0. é avaliado como falso. Isso torna a expressão aparentemente tautológica (v >= 0 && v <= 0) === (v == 0)
falsa.
Por que é null
como 0, embora não seja realmente 0?
javascript
null
comparison
equality
C. Lee
fonte
fonte
null
ouundefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
é um valor variável, para variáveis que não foram inicializadas.null
, por outro lado, é um valor de objeto vazio e não deve ser misturado com números.null
não deve ser combinado com números; portanto, nulo não deve ter que se comportar como números.Respostas:
Sua verdadeira pergunta parece ser:
Por quê:
Mas:
O que realmente acontece é que o Operador Maior que ou Igual (
>=
) executa coerção de tipo (ToPrimitive
), com um tipo de dica deNumber
, na verdade todos os operadores relacionais têm esse comportamento.null
é tratado de maneira especial pelo Operador Equals (==
). Em resumo, ele apenas obriga aundefined
:Valor, como
false
,''
,'0'
, e[]
são sujeitos a tipo numérico coerção, todos eles coagir a zero.Você pode ver os detalhes internos desse processo no algoritmo de comparação de igualdade abstrata e no algoritmo de comparação relacional abstrata .
Em suma:
Comparação relacional: se os dois valores não forem do tipo String,
ToNumber
será chamado nos dois. É o mesmo que adicionar um+
na frente, o que, para coações nulas a0
.Comparação de Igualdade: apenas chama
ToNumber
Strings, Numbers e Booleans.fonte
null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:
- e o que? Você pode explicar por quenull >= 0
? :)+
na frente, o que, para coações nulas a0
. A igualdade chama apenas ToNumber em Strings, Numbers e Booleans.Gostaria de estender a pergunta para melhorar ainda mais a visibilidade do problema:
Isso não faz nenhum sentido. Como as línguas humanas, essas coisas precisam ser aprendidas de cor.
fonte
O JavaScript possui comparações rigorosas e de conversão de tipo
null >= 0;
é verdade mas(null==0)||(null>0)
é falsanull <= 0;
é verdade mas(null==0)||(null<0)
é falsa"" >= 0
também é verdadePara comparações abstratas relacionais (<=,> =), os operandos são primeiro convertidos em primitivos, depois no mesmo tipo, antes da comparação.
typeof null returns "object"
Quando type é objeto, o javascript tenta especificar o objeto (ou seja, nulo), são executadas as seguintes etapas ( ECMAScript 2015 ):
PreferredType
não foi aprovado,hint
seja "padrão".PreferredType
forhint
String,hint
seja "string".PreferredType
éhint
Número,hint
seja "número".exoticToPrim
beGetMethod(input, @@toPrimitive)
.ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
não for indefinido,a) Seja o resultado
Call(exoticToPrim, input, «hint»)
.b)
ReturnIfAbrupt(result)
.c) Se
Type(result)
não for Objeto, retorne resultado.d) Lance uma exceção TypeError.
hint
for "padrão",hint
seja "número".OrdinaryToPrimitive(input,hint)
.Os valores permitidos para a dica são "padrão", "número" e "sequência". Os objetos de data são exclusivos entre o objeto ECMAScript interno, pois tratam "padrão" como sendo equivalente a "sequência". Todos os outros objetos ECMAScript internos tratam "padrão" como sendo equivalente a "número" . ( ECMAScript 20.3.4.45 )
Então, eu acho que se
null
converte em 0.fonte
Eu tive o mesmo problema !!. Atualmente, minha única solução é separar.
fonte
if (a!=null && a>=0)
. Isso esclarece o motivo de não fazer isso>=
sozinho: "a pode ser nulo (ou indefinido, que também é '== nulo')".Matematicamente, isso é estranho. O último resultado afirma que "nulo é maior ou igual a zero", portanto, em uma das comparações acima, deve ser verdadeira, mas ambas são falsas.
O motivo é que uma verificação
==
e comparações de igualdade> < >= <=
funcionam de maneira diferente. As comparações convertem nulo em um número, tratando-o como0
. É por isso que (3)null >= 0
étrue
e (1)null > 0
éfalse
.Por outro lado, a verificação de igualdade
==
paraundefined
enull
é definida de tal forma que, sem qualquer conversão, eles igual uns dos outros e não fazer qualquer outra igual nada. É por isso que (2)null == 0
éfalse
.fonte