development

왜 null> = 0 && null <= 0`이지만 null == 0이 아닌 이유는 무엇입니까?

big-blog 2020. 6. 27. 10:11
반응형

왜 null> = 0 && null <= 0`이지만 null == 0이 아닌 이유는 무엇입니까?


내가 루틴을 작성했다고 단위의 유형 인 경우 (1)에 의한 변수의 값 number변수가 처음이 아닌 경우 변수, 및 양수인 0 null또는 undefined.

첫 번째 구현은 v >= 0 ? v += 1 : v = 0숫자가 아닌 것이 산술 표현식을 거짓으로 만들 것이라고 생각했기 때문에 이루어졌지만 null >= 0true로 평가 된 이후로 잘못되었습니다 . 그런 다음 null0과 같은 동작을 배우고 다음 표현식이 모두 true로 평가됩니다.

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

물론 null0이 아닙니다 null == 0. false로 평가됩니다. 이것은 겉보기에 타우 톨릭적인 표현을 (v >= 0 && v <= 0) === (v == 0)거짓으로 만듭니다.

null실제로 0이 아니지만 0과 같은가?


당신의 실제 질문은 다음과 같습니다.

왜:

null >= 0; // true

그러나:

null == 0; // false

실제로 일어나는 것은 같거나 큰 연산자 ( >=) ToPrimitive힌트 유형으로 유형 강제 변환 ( )을 수행 한다는 것 입니다 Number. 실제로 모든 관계 연산자에는이 동작이 있습니다.

null등호 연산자 ( ==) 가 특별한 방식으로 처리 합니다. 간단히 말해 다음과 같이 강제 됩니다 undefined.

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

값은 같은 false, '', '0',과 [], 그들 모두 0으로 숫자 형식의 강제 적용을 강요하고 있습니다.

이 프로세스의 내부 세부 사항은 추상 동등 비교 알고리즘추상 관계 비교 알고리즘에서 볼 수 있습니다.

요약해서 말하자면:

  • 관계 비교 : 두 값이 모두 문자열 유형이 아닌 경우 두 값 ToNumber모두에서 호출됩니다. 이것은 +앞에 null 을 추가하는 것과 동일 합니다 0.

  • 평등 비교 : ToNumber문자열, 숫자 및 부울 만 호출 합니다.


문제의 가시성을 더욱 향상시키기 위해 질문을 확장하고 싶습니다.

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

말이되지 않습니다. 인간 언어와 마찬가지로 이러한 것들도 마음으로 배워야합니다.


JavaScript에는 엄격한 변환과 형식 변환 비교가 있습니다.

null >= 0;사실이지만 (null==0)||(null>0)거짓

null <= 0;사실이지만 (null==0)||(null<0)거짓

"" >= 0 또한 사실이다

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

typeof null returns "object"

type이 객체 javascript 인 경우 객체를 문자열 화하려고하면 (예 : null) 다음 단계가 수행됩니다 ( ECMAScript 2015 ).

  1. PreferredType통과되지 않은 경우 hint"기본값"으로 설정하십시오.
  2. 경우 다른 PreferredTypehint문자열,하자 hint"문자열"합니다.
  3. 그밖에 PreferredType입니다 hint번호는하자 hint"번호"합니다.
  4. 하자 exoticToPrimGetMethod(input, @@toPrimitive).
  5. ReturnIfAbrupt(exoticToPrim).
  6. exoticToPrim정의되지 않은 경우
    a) 결과를이라고합시다 Call(exoticToPrim, input, «hint»).
    b) ReturnIfAbrupt(result).
    c) Type(result)Object가 아닌 경우 결과를 반환합니다.
    d) TypeError 예외를 던집니다.
  7. 경우 hint"기본"입니다하자 hint"수"를합니다.
  8. 을 반환 OrdinaryToPrimitive(input,hint)합니다.

The allowed values for hint are "default", "number", and "string". Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string". All other built-in ECMAScript objects treat "default" as being equivalent to "number". (ECMAScript 20.3.4.45)

So I think null converts to 0.


I had the same problem !!. Currently my only solution is to separate.

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 !

참고URL : https://stackoverflow.com/questions/2910495/why-null-0-null-0-but-not-null-0

반응형