복붙노트

[JQUERY] === 변수 정의 변수 대 대해서 typeof === "미등록"

JQUERY

=== 변수 정의 변수 대 대해서 typeof === "미등록"

해결법


  1. 1.정의되지 않은 신원 확인 푸 === "foo는 정의되지 않은"오류를 발생하게하는 반면 선언되지 않은 변수의 typeof foo는이 "정의되지 않은"리터럴 문자열을 반환합니다.

    정의되지 않은 신원 확인 푸 === "foo는 정의되지 않은"오류를 발생하게하는 반면 선언되지 않은 변수의 typeof foo는이 "정의되지 않은"리터럴 문자열을 반환합니다.

    (당신이 어딘가에을 선언 알고) 지역 변수의 경우, 이러한 오류는, 따라서 신원 확인을 발생하지 않을 것이다.


  2. 2.나는 모든 곳에서 "정의되지 않은"대해서 typeof foo는 === 사용에 충실 것입니다. 즉 잘못 될 수 없다.

    나는 모든 곳에서 "정의되지 않은"대해서 typeof foo는 === 사용에 충실 것입니다. 즉 잘못 될 수 없다.

    내가 jQuery를이 두 가지 방법을 추천하는 이유는 그들이 jQuery 코드의 삶, 그렇게 그 함수 내 외부에서 조작으로부터 안전 정의되지 않은 그 함수 내에서 자신의 정의되지 않은 변수를 정의하는 것이 상상. 나는 또한 그 누군가 곳은 두 개의 서로 다른 접근 방식을 벤치마킹하고 빠른 정의되지 않은 그 foo는 === 발견 한 상상 따라서 갈 수있는 방법 결정한다. [업데이트 : 코멘트에 언급 한 바와 같이, 정의와 비교가 고려 될 수있는, 또한 약간 짧습니다. 그러나, 실제 상황에서 이득을 완전히 무의미 할 것이다 :이 검사는, 지금까지 병목 현상의 어떤 종류 수 없을 것이며, 당신이 잃을 것은 중요하다 : A는 않을 것입니다 확인 대해서 typeof 반면 비교를 위해 호스트 개체의 속성을 평가하는 오류가 발생 할 수 있습니다.

    예를 들어, 다음 XML을 구문 분석 IE에서 사용된다 :

    var x = new ActiveXObject("Microsoft.XMLDOM");
    

    그것은 loadXML 메소드를 안전하게 있는지 여부를 확인하려면 :

    typeof x.loadXML === "undefined"; // Returns false
    

    한편 :

    x.loadXML === undefined; // Throws an error
    

    최신 정보

    내가 언급하는 것을 잊었다하는 대한 typeof 검사의 또 다른 장점은 또한 푸 === 정의되지 않은 검사를하지 않는, 선언되지 않은 변수로 작동하고, 사실에 오류 ReferenceError이었다. 저를 생각 나게하기위한 @LinusKleen 감사합니다. 예를 들면 :

    typeof someUndeclaredVariable; // "undefined"
    someUndeclaredVariable === undefined; // throws a ReferenceError
    

    결론 : 항상 대해서 typeof 검사를 사용합니다.


  3. 3.그러나 대해서 typeof-변형을 사용하는 또 다른 이유 : 정의되지는 다시 정의 할 수 있습니다.

    그러나 대해서 typeof-변형을 사용하는 또 다른 이유 : 정의되지는 다시 정의 할 수 있습니다.

    undefined = "foo";
    var variable = "foo";
    if (variable === undefined)
      console.log("eh, what?!");
    

    대해서 typeof 변수의 결과는 할 수 없습니다.

    업데이트 :이 ES5가 글로벌 정의의 경우가 아니라고 노트는 비 구성, 쓰기 가능하지 않은 속성입니다 :

    그러나 여전히 지역 변수에 의해 그림자가 될 수있다 :

    (function() {
      var undefined = "foo";
      var variable = "foo";
      if (variable === undefined)
        console.log("eh, what?!");  
    })()
    

    또는 매개 변수 :

    (function(undefined) {
      var variable = "foo";
      if (variable === undefined)
        console.log("eh, what?!");  
    })("foo")
    

  4. 4.누가 여기 좀 걸릴 수 있습니다, 정의되지 않은 변수의 성능 향상 ===에 관심이 있지만, 단지 크롬 최적화 될 것으로 보인다.

    누가 여기 좀 걸릴 수 있습니다, 정의되지 않은 변수의 성능 향상 ===에 관심이 있지만, 단지 크롬 최적화 될 것으로 보인다.


  5. 5.때문에 항상 선언되지 않은 정의되지 않은,하지만 jQuery를 자사의 주요 기능에 정의되지 않은 선언합니다. 그들은 안전하고 정의되지 않은 내부 값,하지만 외부를 사용 그래서 그들은 안전 할과 typeof 스타일을 사용합니다.

    때문에 항상 선언되지 않은 정의되지 않은,하지만 jQuery를 자사의 주요 기능에 정의되지 않은 선언합니다. 그들은 안전하고 정의되지 않은 내부 값,하지만 외부를 사용 그래서 그들은 안전 할과 typeof 스타일을 사용합니다.


  6. 6.그들은 지역의 범위 내 어딘가에 정의되어 있어야합니다 또는 로컬로 간주되지 않기 때문에 지역 변수의 경우, 지역 변수를 === 정의되지 않은 의지 작업으로 검사합니다.

    그들은 지역의 범위 내 어딘가에 정의되어 있어야합니다 또는 로컬로 간주되지 않기 때문에 지역 변수의 경우, 지역 변수를 === 정의되지 않은 의지 작업으로 검사합니다.

    로컬 어디서나 정의되지없는 변수의 정의되지 않은 수표의 somevar ===는 예외를 발생 : ReferenceError가 catch되지는 : j는 정의되지

    여기에 내가 위에서 말하고있는 것을 명확하게 몇 가지 코드입니다. 임금의 관심은 더 선명도에 대한 의견을 인라인하시기 바랍니다.

    function f (x) {
        if (x === undefined) console.log('x is undefined [x === undefined].');
        else console.log('x is not undefined [x === undefined.]');
    
        if (typeof(x) === 'undefined') console.log('x is undefined [typeof(x) === \'undefined\'].');
        else console.log('x is not undefined [typeof(x) === \'undefined\'].');
    
        // This will throw exception because what the hell is j? It is nowhere to be found.
        try
        {
            if (j === undefined) console.log('j is undefined [j === undefined].');
            else console.log('j is not undefined [j === undefined].');
        }
        catch(e){console.log('Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.');}
    
        // However this will not throw exception
        if (typeof j === 'undefined') console.log('j is undefined (typeof(x) === \'undefined\'). We can use this check even though j is nowhere to be found in our source code and it will not throw.');
        else console.log('j is not undefined [typeof(x) === \'undefined\'].');
    };
    

    우리는이 같은 위의 코드를 호출하는 경우 :

    f();
    

    출력이 될 것이다 :

    x is undefined [x === undefined].
    x is undefined [typeof(x) === 'undefined'].
    Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
    j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
    

    우리는 (실제로 값) 이와 같은 위의 코드를 호출하는 경우 :

    f(null); 
    f(1);
    

    출력은 다음과 같습니다

    x is not undefined [x === undefined].
    x is not undefined [typeof(x) === 'undefined'].
    Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
    j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
    

    이 같은 검사를 수행 할 때 대해서 typeof X === '정의', 당신은 기본적으로이 요청하고 있습니다 : 변수 x는 소스 코드 (정의 된) 어딘가에 존재하는지 확인하시기 바랍니다. (이상 또는 이하). 당신은 C #이나 자바 알고있는 경우에 존재하지 않는 경우, 그것은 컴파일하지 않기 때문에, 검사의이 유형은 수행되지 않습니다.

    <== 바이올린 나 ==>


  7. 7.전역 범위에서 우리가 실제로 true를 반환 할 때, 변수는 선언이나 정의되지 않은 값을 가지고 있지 않은 경우 :

    전역 범위에서 우리가 실제로 true를 반환 할 때, 변수는 선언이나 정의되지 않은 값을 가지고 있지 않은 경우 :

    VAR globalVar1; //이 변수 선언 아니지만 정의함으로써 값을 갖는다 미정 CONSOLE.LOG (globalVar1 === 정의); //이 변수는 ReferenceError가 발생합니다 이렇게 선언되지 않았습니다 CONSOLE.LOG (globalVar2 === 정의);

    변수가 선언 된 경우 전역 범위에서 우리가 100 % 확신하기 때문에이 우리에게 ReferenceError가를 줄 수 있습니다. 우리가 알 수없는 변수에 typeof 연산자를 사용하는 경우 우리는 변수가 선언되지 않았습니다이 문제를 못하고 있습니다 :

    VAR globalVar1; CONSOLE.LOG은 (대해서 typeof globalVar1 ===가 '미정의'); CONSOLE.LOG은 (대해서 typeof globalVar2 ===가 '미정의');

    이는 변수가 현재 선언 여부를 때 문자열이 정의되지 않은 typeof 연산자의 리턴 값이 우리가 원하는 정확히 어떤 정의되지 잡고 있다는 사실이다.

    OBJ = {}이었다; CONSOLE.LOG (obj.myProp ===는 정의);


  8. 8.=== 대해서 typeof '미정의'빠르다 후 === '미정의'노드 v6.9.1에 약 2 배.

    === 대해서 typeof '미정의'빠르다 후 === '미정의'노드 v6.9.1에 약 2 배.

  9. from https://stackoverflow.com/questions/4725603/variable-undefined-vs-typeof-variable-undefined by cc-by-sa and MIT license