내가 루틴을 작성했다고 단위의 유형 인 경우 (1)에 의한 변수의 값 number
변수가 처음이 아닌 경우 변수, 및 양수인 0 null
또는 undefined
.
첫 번째 구현은 v >= 0 ? v += 1 : v = 0
숫자가 아닌 것이 산술 표현식을 거짓으로 만들 것이라고 생각했기 때문에 이루어졌지만 null >= 0
true로 평가 된 이후로 잘못되었습니다 . 그런 다음 null
0과 같은 동작을 배우고 다음 표현식이 모두 true로 평가됩니다.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
물론 null
0이 아닙니다 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 ).
PreferredType
통과되지 않은 경우hint
“기본값”으로 설정하십시오.- 경우 다른
PreferredType
인hint
문자열,하자hint
“문자열”합니다. - 그밖에
PreferredType
입니다hint
번호는하자hint
“번호”합니다. - 하자
exoticToPrim
수GetMethod(input, @@toPrimitive)
. ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
정의되지 않은 경우
a) 결과를이라고합시다Call(exoticToPrim, input, «hint»)
.
b)ReturnIfAbrupt(result)
.
c)Type(result)
Object가 아닌 경우 결과를 반환합니다.
d) TypeError 예외를 던집니다.- 경우
hint
“기본”입니다하자hint
“수”를합니다. - 을 반환
OrdinaryToPrimitive(input,hint)
합니다.
힌트에 허용되는 값은 “default”, “number”및 “string”입니다. Date 객체는 내장 된 ECMAScript 객체 중에서 고유하며 “default”를 “string”과 동일하게 취급합니다.
다른 모든 내장 ECMAScript 객체는 “default”를 “number”와 동등한 것으로 간주합니다 . ( ECMAScript 20.3.4.45 )
그래서 null
0으로 변환 한다고 생각 합니다.
답변
나는 같은 문제가 있었다!. 현재 내 유일한 해결책은 분리하는 것입니다.
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 !
답변
console.log( null > 0 ); // (1) false
console.log( null == 0 ); // (2) false
console.log( null >= 0 ); // (3) true
수학적으로는 이상합니다. 마지막 결과는 “null이 0보다 크거나 같다”는 것이므로 위의 비교 중 하나에서 true 여야하지만 둘 다 false입니다.
그 이유는 평등 검사 ==
와 비교가 > < >= <=
다르게 작동하기 때문입니다. 비교는 null을 숫자로 변환하여로 처리합니다 0
. 그렇기 때문에 (3) null >= 0
은 true
(1) null > 0
은 false
입니다.
반면에, 동등 검사 ==
에 대한 undefined
과는 null
어떠한 변환없이, 그들은 서로 동일하고 다른 동일 아무것도하지 않는, 그런 것을 정의된다. 그렇기 때문에 (2) null == 0
는 false
입니다.