IT

null >= 0 & & null <= 0>인데 null == 0이 아닌 이유는 무엇입니까?

itgroup 2023. 10. 10. 20:14
반응형

null >= 0 & & null <= 0>인데 null == 0이 아닌 이유는 무엇입니까?

의 종류가 을 1 그 .number그리고 않은 을 할당합니다.에 0합니다입니다. 여기서 변수는 처음에null아니면undefined.

번째 은 였습니다.v >= 0 ? v += 1 : v = 0가 아닌 으로 만들 이라고 생각했기 입니다 로 틀렸습니다. 하지만 그것은 그 이후로 틀렸습니다.null >= 0참으로 평가됩니다.그 후에 나는 배웁니다.null0처럼 동작하며 다음 식을 모두 true로 평가합니다.

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1 / null === Infinity
  • Math.pow(42, null) === 1

요, 이야.null0이 아닙니다.null == 0거짓으로 평가됩니다. 보이는 다로 .(v >= 0 && v <= 0) === (v == 0)

요?null실제로는 0이 아니지만 0처럼?

당신의 진짜 질문은 다음과 같습니다.

이유:

null >= 0; // true

그러나:

null == 0; // false

실제로 일어나는 것은 Greater-than-equal Operator (>=), 형식 강제()ToPrimitive를 수행합니다.Number을 합니다 . .

null이퀄스 오퍼레이터에 의해 특별한 방식으로 처리됩니다(==). 간단히 말해서, 그것은 단지 다음과 같이 강요할 뿐입니다.undefined:

null == null; // true
null == undefined; // true

과 같은 값false,'','0',그리고.[]숫자 형태의 강제가 적용되며, 모두 0으로 강제됩니다.

이 프로세스의 내부 세부 정보는 추상적 평등 비교 알고리즘추상적 관계 비교 알고리즘에서 확인할 수 있습니다.

요약 내용:

  • 두 값 유형이 : String ToNumber둘 다 호출됩니다.다에.+에서,입니다에 대한 를 위해 0.

  • 만 합니다.ToNumber문자열, 숫자 및 부울런에 대한 정보를 제공합니다.

문제를 좀 더 잘 파악할 수 있도록 질문을 확장하고자 합니다.

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

말이 안 돼요.인간의 언어처럼, 이런 것들은 암기해야 합니다.

자바스크립트는 엄격한 비교와 유형 변환 비교를 모두 가지고 있습니다.

null >= 0;이지만 ㅇ(null==0)||(null>0)

null <= 0;이지만 ㅇ(null==0)||(null<0)

"" >= 0또한 사실입니다.

관계형 추상 비교(<=, >=)의 경우 피연산자를 비교 전에 먼저 프리미티브로 변환한 다음 동일한 유형으로 변환합니다.

typeof null returns "object"

type is object javascript가 개체를 문자열화하려고 하면(즉 null) 다음 단계가 수행됩니다(ECMAscript 2015).

  1. 한다면PreferredType..hint"default" 입니다.
  2. 그 외의 경우PreferredType이다.hint,렛열, 렛hint끈이 나다
  3. 또 다른PreferredType이다.hint렛호, 렛hint수가 많다, 수가 많다, 수가 많다, 수가 많다, 수가?
  4. 허락하다exoticToPrim있다GetMethod(input, @@toPrimitive).
  5. ReturnIfAbrupt(exoticToPrim).
  6. 한다면exoticToPrim정의되지 않은 것은 아닙니다.
    a) 결과를 다음과 같이 하시오.Call(exoticToPrim, input, «hint»).
    b)ReturnIfAbrupt(result).
    c) 만약에Type(result)개체가 아닙니다. 반환 결과입니다.
    d) TypeError 예외를 던집니다.
  7. 한다면hint는 "default", lethint수가 많다, 수가 많다, 수가 많다, 수가 많다, 수가?
  8. 돌아가다OrdinaryToPrimitive(input,hint).

힌트에 허용되는 값은 "default", "number" 및 "string"입니다.날짜 개체는 "default"를 "string"과 동일한 것으로 취급한다는 점에서 내장된 ECMAscript 개체 중에서 고유합니다.기본 제공되는 다른 모든 ECMA스크립트 개체는 "default"를 "number"와 동일한 것으로 취급합니다. (ECMA스크립트 20.3.4.45).

그래서 저는.null0으로 변환합니다.

console.log( null > 0 );  // (1) false
console.log( null == 0 ); // (2) false
console.log( null >= 0 ); // (3) true

수학적으로 이상하네요.마지막 결과는 "null은 0보다 크거나 같다"는 것이므로 위의 비교 중 하나에서는 이 값이 참이어야 하지만 둘 다 거짓입니다.

그 이유는 평등성 검사가==비교.> < >= <=일을 달리하다비교는 null을 숫자로 변환하여 다음과 같이 취급합니다.0. 그래서 (3)null >= 0true(1)null > 0false.

다른 한편으로는 평등성 확인==위해서undefined그리고.null변환 없이 서로 동등하고 다른 것과 동일하지 않도록 정의됩니다.그래서 (2)null == 0false.

저도 똑같은 문제가 있었어요!!현재 저의 유일한 해결책은 분리하는 것입니다.

var a = null;
var b = undefined;

if (a===0||a>0){ } //return false  !work!
if (b===0||b>0){ } //return false  !work!

//but 
if (a>=0){ } //return true !

확인하는 방법인 것 같습니다.x >= 0!(x < 0)그런 식으로 반응을 이해할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2910495/why-null-0-null-0-but-not-null-0

반응형