2012-06-26 4 views
2

이것은 확장 된 버전이 내가 상상했던 방식대로 작동하지 않는 이유에 의해 진술이 어리둥절 해지면 속기를 쓰는 첫 번째 시도입니다.약식 구문이 자바 스크립트에서 작동하지 않는 이유는 무엇입니까?

코드 1 -

if(document.getElementById != false) { 
      alert("The document object model is supported by: " + navigator.appName); 
     } 

코드 3 작동합니까 - -

if(document.getElementById == true) { 
     alert("The document object model is supported by: " + navigator.appName); 
    } 

코드 2가 작동하지 않습니다 수행하는 속기가 작동

if(document.getElementById) { 
      alert("The document object model is supported by: " + navigator.appName); 
     } 

왜 3의 단축형을 작동하지 않는 첫 번째 코드 샘플로 확장하면 != false과 동일한 경우 왜 작동합니까?

+3

표현식을 부울 상수와 비교하는 것은 실제로 나쁜 습관입니다. – Pointy

+0

@Pointy - 그럼 if (document.getElementById) 표현식을 읽으면 어떻게 될까요? if (condition == true/somevalue) 그런 다음 코드를 실행 하시겠습니까? – PeanutsMonkey

+0

함수 나 표현식에 부울 결과가있는 경우 비교할 필요가 없습니다. 표현식을 "속기"라고하는 것으로 사용할 준비가되었습니다. 즉, if 문의 괄호 안의 표현식은 부울로 해석됩니다. 부울 값을 가진 표현식을 사용하면 완료됩니다. 만약 당신이 그것을 부정하고 싶다면, 그 앞에'! '를 두십시오. – Pointy

답변

2

if 문 : document.getElementById이 객체의 유형 함수이며, 객체가 true 동일하지 않기 때문에

if(document.getElementById == true) { 

...이 작동하지 않습니다.

두 번째 if 문 :

if(document.getElementById != false) { 

... 정말 작동하지 않습니다 - 당신이하지 생각에도 불구하고 - (내가 있으리라 믿고있어) 만 document.getElementById 어디 브라우저에서 테스트했기 때문에 어떤 경우에, 다시 .getElementByIdfalse과 같지 않은 객체 유형의 함수입니다.또한trueundefined != false 경우 그러나.getElementById 인 경우 테스트가 효율적으로 테스트 될 경우 다음 정의되지. 그래서 그 시험은 당신이 생각하는대로하지 않습니다.

세 번째 if 문 :

if(document.getElementById) { 

... 않는 일. 그 이유는 JavaScript가 "진실"과 "위증"표현의 개념을 가지고 있기 때문입니다. 숫자 0, 빈 문자열 "", undefined, null, NaN 및 물론 false은 모두 "위조"값입니다. 0이 아닌 숫자, 비어 있지 않은 문자열 및 을 비롯한 거의 모든 항목이 기능을 포함하여 개의 객체가 "사실"입니다. if의 표현식이 "truthy"이면 if 블록이 실행됩니다.

(마지막으로, 정말 document.getElementById이 있는지 여부를 테스트 할 필요가없는 -. 당신이 JS를 실행하지만 방법을 정의하지 않는 브라우저를 찾을 수 있다면 나는 깜짝 놀라게 할 것가)

1

document.getElementById이 존재하지만, true이 아니기 때문에. 을 시도해보고 결과를 확인하십시오. truefalse이 아닙니다.

자세한 내용은 here을 참조하십시오. 최선 그렇게 할

당신은 부울과 비교하지 않아도은 다음과 같습니다

if(document.getElementById){ 
    //Do something 
} 
+0

나는 물지 만, 그것이 '사실'또는 '거짓'이 아닌 경우 두 번째 문장은 왜 작동합니까? – PeanutsMonkey

+1

PeanutsMonkey - 두 번째 예제는'document.getElementById'가 존재하고 "truthy"이고 truthy 값이'false'가 아니기 때문에 작동하는 것 같습니다. 그러나 함수가 정의되어 있지 않으면 비교가'true' 인'undefined! = false'가되기 때문에 실제로 제대로 작동하지 않습니다. (이 값을'if (document.blah! = false)'로 변경하여 테스트 할 수 있습니다. 또한 'true'가됩니다.) – nnnnnn

+0

@PeanutsMonkey DOM 요소 참조가 부울 상수'false'와 같지 않기 때문에 – Pointy

1

코드 1 truthy하지만 사실이 아니다. getElementById는 객체이지만 boolean이 아니므로 하나와 비교하면 false가됩니다. 여기

이 truthiness 및 falsyness의 개념을 설명하는 블로그 : http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

+1

_ "그것은 불리언 값이 아니므로 거짓임을 알 수 있습니다"_ - document.getElementById == true 비교의 결과는 실제로 부울'false' (거짓이 아님)이됩니다. true 또는 false가 될만한 것은'document.getElementById' 부분입니다. – nnnnnn

+0

@marteljn - 내 직책에있는 진술에 강요 평등과 엄격한 평등 운영자는 어떤 역할을합니까? – PeanutsMonkey

+0

귀하의 권리는 직접 적용되지 않습니다. 나는 그것이 JS 비교를 이해하는 데 도움이 되었기 때문에 그것을 포함 시켰고, 누군가를 혼란스럽게하지 않기 위해 제거 할 것이다. – marteljn

1

이 처음이 작동하지 않습니다 대해서 typeof document.getElementById은 '기능'이고 그 값은 네이티브 코드가 아닌 부울 "true"로하기 때문이다.

Re. 세번째 예를 들어, 대신이 시도 :

if (!!document.getElementById) ... 

!!는 결과에 부울 유형을 강제 할 것이다.

+0

'document.getElementById'가 true 또는 false 일 것이기 때문에'if' 메소드는'if' 테스트에서 불필요합니다 - OP는 이미 세 번째 예제가 작동한다고 말했습니다; 질문은 왜 첫 번째가 작동하지 않는지 ... – nnnnnn

+0

실제로 필요한 것입니다. 'if (Foo) console.log ('Foo')'를 시도하면 "ReferenceError : Foo is not defined"가 기록됩니다. –

+0

'document'가 정의되어 있고 그것이 있는지 여부를 테스트하고 싶다면 이미 필요하지 않습니다. 메소드'.getElementById'. 또는 좀 더 일반적으로'someObject'가 정의되어 있고'someObject.someMethod'를 테스트하고 있다는 것을 알고 있다면 더 일반적입니다. 변수를 테스트하는 것은 객체의 속성을 테스트하는 것과는 다릅니다 ... – nnnnnn

0

가 여기에 대답

단계 3에서 절차는 true 값으로 객체를 캐스팅하는 ToBoolean을 호출합니다. ToBoolean 함수는 "truthy"와 "falsy"값의 개념을 얻는 곳입니다. 이들은 각각 ToBoolean에 의해 truefalse으로 캐스팅 된 값입니다.

이제 == 연산자에 사용되는 Abstract Equality Comparison Operation을 살펴보십시오. Object == boolean의 절차 흐름은 ToBoolean에 대한 간단한 호출보다 훨씬 복잡합니다. 그것은 다음과 같이 진행됩니다

For some comparison x == y... 

1. If Type(x) is different from Type(y), go to step 14. 
19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 

(Go back to step 1, with the boolean cast to a Number by ToNumber[1], then...) 

21. If Type(x) is Object and Type(y) is either String or Number, return 
    the result of the comparison ToPrimitive(x)== y. 

(ToPrimative[2] calls the object's toString method; now compare String == Number) 

17. If Type(x) is String and Type(y) is Number, return the result of the 
    comparison ToNumber(x)== y. 

(ToNumber turns the string "function()..." into NaN. Finally...) 

5. If x is NaN, return false 

또한 참조 :

[1] ToNumber

[2] 꽤 긴 하나입니다, [[DefaultValue]]를 호출 ToPrimative을. 다행스럽게도이 경우 2 단계에서 신속하게 해결됩니다.

관련 문제