2010-11-25 3 views
2

코드 조각 1 :Boolan (! x)과 부울 (x == 0)의 차이점은 무엇입니까?

if (!x) { /* do stuff */ } 

코드 조각 2 :이 두 코드 조각이 다른 x 어떤 값이 어떻게 들어

if (x == 0) { /* do stuff */ } 

?

사양에서 == 장을 읽었을지라도 위와 같은 상황 (ToBoolean 강제 변환과 결합 된 경우)을 처리하는 것이 어렵다는 것을 알고 있기 때문에 묻습니다.

btw (언어를 이해하고 싶습니다.) ===에 대해 나에게 말하면 신경 쓰지 말고 x이 무엇인지 물어보십시오.

업데이트 : 주먹 발췌 문장을 수정했습니다. 나는 !x을 의미했습니다.

+0

아마도 (x == true) 또는 라인을 따르는 무언가가 0이면 false를 의미합니다. – Raynos

+1

당신은'if (!x)'및'if (x == 0)'? –

답변

2

다음은 두 번째 조각에 대한 첫 번째와 false 당신에게 true을 줄 것이다 두 번째 코드 단에 대해 true :

  • []
  • "0"및 기타, 0은 "00"로 Number(x)을 사용하여 "000"로 변환 문자열 "0"및 "0"을 (지금 호출합니다 "
  • 0, null, undefined 또는 비어 있거나 들뜬 문자열 인 단일 요소를 포함하는 배열입니다.

내가 생각하지 못한 경우가 하나 더있을 수 있지만 다른 모든 경우에 대해 두 조각에 대해 동일한 결과가 표시됩니다.

+0

+1 네, 여기서 중요한 사실은 두 번째 경우에 'x'가 숫자 값으로 강제 변환된다는 것입니다. 따라서 어떤 값이 숫자 0을 강요하는지 이해하는 것이 중요합니다. –

5
  • [] == 0입니다. ![]은 거짓입니다.
  • null == 0은 거짓입니다. !null이 참일 경우
  • NaN == 0이 거짓 인 경우; !NaN이 참일 경우
  • undefined == 0이 거짓 인 경우; !undefinedx는 "falsy"인지 여부를 확인합니다

!x 사실이다.
x == 0x이 "0"과 동일한 지 여부를 확인합니다.

이 두 용어는 모두 Javascript 사양으로 정의됩니다.

+1

'0'은 ** 허위 **입니다. – jwueller

+0

@SLaks 예, 업데이트되었습니다. 이것이 내가 의미했던 것입니다. –

+0

@elusive : 예; 그것이 내가 의미했던 것입니다. – SLaks

1

짧은 대답 : 둘은 거의 동일하지만 100 % 동일하지 않습니다. 값이 true 또는 false가 간단한 경우 확인 http://www.joeyjavas.com/2007/08/04/javascript-true-false-checking-for-boolean-values/

:에서

: ('0' == 0)

세부 사항에 해당하는 반면

예는 거짓 (!'0') 것 자바 스크립트에서. 모든 값은 제외하고, true로 평가 :

0 
-0 
null 
undefined 
NaN 
empty string 
false 

따라서, (!x)x 만 그 중 위의 모든 값에 대해 true가됩니다.

(x == 0)와 마찬가지로 숫자의 경우 (예 : 부울 false 값) - when converted according to "==" conversion rules -이 0으로 변환되는 x의 모든 값에 적용됩니다.==0 true로 비교 다른 예는 valueOf() 방법 0를 생성하는 개체, 또는 문자열 '0', 비어있는 배열 ([])

+0

+1 예 (x == 0)는 x를 숫자 값으로 강제 변환합니다. 지금은 이해. –

0

둘 사이의 차이는

if (x) { ... } 

테스트 X인지

if (x == 0) { ... } 

강압 B를 입력합니까

반면 "truthy"인 etween x와 0

나는 당신의 가장 큰 차이점은 x가 falsy 경우 확인 대 숫자로 X의 강제를 입력입니다

if (x == 0) vs if (!x) 

같은 것을 의미 추정.

분명히 NaN은 숫자가 아니기 때문에 절대로 0이되지 않습니다. 그는 == 0에 의해 체포되지 않도록 undefined도 NaN이에 강요합니다 나는 nullx 제로가 아닌, 또는로 평가되면 첫 번째 테스트가 성공 Number(null) == 0

+0

죄송합니다. 제 질문에 오타가 있습니다. 나는'x'가 아닌'x'를 의미했습니다. –

+0

웃음을 짓기 위해서 : alert (typeof NaN); – BGerrissen

0

이후 0에 의해 체포되지 않는 이유 좋은 설명을 드릴 수 없습니다 개체 (null 또는 undefined과 반대)이거나 비어 있지 않은 문자열입니다. 따라서 x이 0이면 조건은 실패하지만 "0"이면 성공합니다.

x이 0으로 변환 될 때 두 번째 테스트가 성공합니다. 즉,이 테스트를 통과하기 위해 null, 정의되지 않음 또는 개체 여서는 안됩니다. 그리고 그것은 "0"또는 ""일 수 있습니다.

즉, 이러한 조건문 은 서로 상반되지 않습니다.입니다. 값 "0"은 두 테스트를 통과합니다.

  • NaN
  • null
  • undefined

을 그리고이 첫 번째 당신에게 false을 줄 것이다 :

0

x이 "거짓"값일 경우 코드 스 니펫 1이 실행됩니다. 자바에서는 0, -0, null, undefined, NaN, ""또는 false를 의미합니다. 그러나 Code Snippet 2는 x이 0 일 때만 실행됩니다. 첫 번째 조건과 달리 여기에는 다른 "거짓"값이 포함되지 않습니다.

+1

두 번째 스 니펫은 'x'가 0 일뿐만 아니라 0으로 강제 변환되는 모든 값에 대해서도 실행됩니다. "0"또는 []와 마찬가지로 –

+0

"0"은 "0"을 강요하지만 많은 다른 가치들도 잘 알고 있습니다. 수정 주셔서 감사! –

2

여기가 비어 있지 않은 문자열에 관한 흥미로운 일에만 공백 문자 : 당신이 == 비교를하고, 값 중 하나가 비교되는 경우이 숫자 나 때문에

!!" ";   // true 
" " == true; // false 

입니다 부울 값이면 다른 값을 숫자로 변환하려고 시도합니다.

다른 결과를 얻는 이유는 공백 만있는 문자열이 0 (또는 false)으로 변환되는 반면 공백 만있는 문자열은 !!을 통해 부울로 변환되는 것은 비어 있지 않은 문자열로 간주되며 그러므로 true.

그래서 :

var x = " "; 

alert(!x);  // false 
alert(x == 0); // true 

편집 : 아마

기억해야 할 중요한 것은 숫자를 비교 또는 비 숫자 유형 부울 때, ==toNumber 변환을 사용한다는 것입니다 가능하다면 !에서부터 부울까지의 변환을 사용합니다. 항상 같은 것은 아닙니다.

의 결과를 을 사용하여으로 변환하는 것이 쉽습니다.

alert(!![]); // true 

그러나 ==를 사용할 때 정말 toNumber 변환의 결과를 볼 수 없습니다 : 마찬가지로.

+을 사용하면 에서으로 변환하는 결과를 볼 수 있습니다. 마찬가지로 : 나는 무슨 일이 배열의 경우에 일어나는 것을 확신

alert(+[]); // 0 

, 그것은 먼저 toString 전화를 가져옵니다이다. 따라서 :

// ---------------------toString result-------toNumber result (from string) 
alert(+[]);  //  ""     0  
alert(+[""]);  //  ""     0  
alert(+[" "]); //  "  "    0  
alert(+[0]);  //  "0"     0  
alert(+["0"]); //  "0"     0  
alert(+["3"]); //  "3"     3  
alert(+[3,4]); //  "3,4"    NaN 
+0

+1 친애하는 하나님, 형용사와'=='를 결합하는 것이 JavaScript의 가장 혼란스러운 부분입니다. –

+0

@ Šime Vidas - 실제로 그렇습니다. 의심이 간다면'==='를 사용하는 것이 더 낫습니다. 요 전날이 특정 상황에 대해 질문했습니다. 나는 왜 이것이 사양인지를 조금씩 읽어야했다. 물론, String을 Number로 변환 할 때 공백 만있는 빈 문자열과 문자열은 '0'으로 간주됩니다. – user113716

+0

** ECMAScript 5, 섹션 9.3.1 ** : 비어 있거나 공백 만 포함하는 StringNumericLiteral은 + 0으로 변환됩니다. * ** ECMAScript 5, 섹션 9.2 ** : * 문자열 : 인수는 빈 문자열이며 길이는 0입니다. 그렇지 않으면 결과는 true입니다. * 따라서 공백 만있는 비어 있지 않은 문자열의 경우 'true/false'값을 비교하기 위해 두 결과가 반대입니다. – user113716

0

일부 조회 후, 내 awnser를 변경해야합니다. 단순한 논리가 없으며 암시적인 항등 연산이 알고리즘을 따릅니다. http://interglacial.com/javascript_spec/a-11.html#a-11.9.3

알고리즘을 설명하는 것이 더 나아질 수는 없지만 더 혼란 스러울 것입니다.

는 그래서 (!x)(typeof x === false) 일명 (사실이 아니다)
그리고 (x == 0) 알고리즘에 의해 비교됩니다에 해당합니다.

+0

하단의 예에서 세 번째 것은 잘못되었습니다. 부울 또는 숫자 변환이 일어나지 않기 때문에 두 Array 객체 인스턴스를 비교하여 동일한 인스턴스인지 확인합니다. 두 개의 고유 한 인스턴스이므로'false '를 반환합니다. – user113716

+0

@patrick, 고마워, 그것은 2 way 변환과 afterall 비교를한다;) updated – BGerrissen

+0

당신을 진심으로 환영한다. 전환은 까다 롭습니다. Object를 숫자와 비교할 때 Object는 * ToPrimitive *로 보내집니다. * ToValue *는 * valueOf *를 호출하여 객체를 반환하므로 * toString *을 호출하여 반환합니다 값. 그런 다음 * String * == * Number * 결과를 비교합니다. 즉 문자열이 * toNumber *로 변환됩니다. 궁극적으로, 그것은'Array> ToString> ToNumber === Number'입니다. 다행스럽게도 매일 스펙을 읽을 필요가 없습니다! : o) – user113716

관련 문제