[javascript] typeof! ==“undefined”vs.! = null

정의되지 않은 매개 변수 등을 확인하는 JavaScript 코드가 종종 있습니다.

if (typeof input !== "undefined") {
    // do stuff
}

형식 조회와 문자열 비교가 포함되어 있기 때문에 다소 낭비 적입니다. undefined이름을 바꿀 수 있기 때문에 필요합니다 .

내 질문은 :
이 코드는이 접근법보다 나은 방법입니다.

if (null != input) {
    // do stuff
}

내가 아는 한 재정의 할 수 없으므로 null예기치 않게 중단되지 않습니다. 그리고, !=연산자 의 타입 강제 때문에 , 이것은 당신이 원하는 것 (예를 들어 선택적 함수 매개 변수) undefinednull정확히 같은 것을 모두 검사합니다 .

그러나이 형식은 널리 퍼져 있지 않으며, 악의 !=연산자 를 사용하는 것에 대해 JSLint가 소리를 지르게합니다 .

이것이 왜 나쁜 스타일로 간주됩니까?



답변

typeof 식별자가 이전에 선언되지 않았으므로 더 안전합니다.

if(typeof neverDeclared === "undefined") // no errors

if(neverDeclared === null) // throws ReferenceError: neverDeclared is not defined


답변

변수가 var키워드, 함수 인수 또는 전역 변수로 선언 되면 가장 좋은 방법은 다음과 같습니다.

if (my_variable === undefined)

jQuery는 그것을 수행하므로 나에게 충분합니다 🙂

그렇지 않으면를 typeof피하기 위해 사용해야 합니다 ReferenceError.

undefined가 재정의 될 것으로 예상되면 다음과 같이 코드를 래핑 할 수 있습니다.

(function(undefined){
    // undefined is now what it's supposed to be
})();

또는 void연산자 를 통해 얻습니다 .

const undefined = void 0;
// also safe


답변

좋은 방법 :

if(typeof neverDeclared == "undefined") //no errors

그러나 가장 잘 보이는 방법은 다음을 통해 확인하는 것입니다.

if(typeof neverDeclared === typeof undefined) //also no errors and no strings


답변

정의되지 않은 이름이 바뀌는 것에 대해 걱정할 필요가 없습니다. 누군가가 정의되지 않은 이름을 바꾸면 수표가 실패하는 것보다 몇 가지 문제가 더 많습니다. 코드를 실제로 보호하려면 다음과 같이 IFFE (즉시 호출 된 함수 표현식)로 코드를 래핑하십시오.

(function($, Backbone, _, undefined) {
    //undefined is undefined here.
})(jQuery, Backbone, _);

브라우저 환경에서 전역 변수 (이미 잘못된)로 작업하는 경우 다음과 같이 정의되지 않은지 확인합니다.

if(window.neverDefined === undefined) {
    //Code works
}

전역 변수는 창 개체의 일부이므로 문자열로 캐스팅하고 문자열을 비교하는 대신 정의되지 않은 변수를 간단히 확인할 수 있습니다.

무엇보다 변수가 정의되지 않은 이유는 무엇입니까? 변수 존재를 확인하고 그에 따라 몇 가지 작업을 수행하는 많은 코드를 보았습니다. 이 접근법이 올바른 곳을 한 번도 보지 못했습니다.


답변

정의되지 않은 재정의가 정말로 걱정된다면 다음과 같은 도우미 메소드를 사용하여 이것을 막을 수 있습니다.

function is_undefined(value) {
   var undefined_check; // instantiate a new variable which gets initialized to the real undefined value
   return value === undefined_check;
}

이것은 누군가가 글 undefined = "foo"을 쓸 때 이름 만 허용 하기 때문에 작동합니다 undefined 이 새로운 값을 참조하도록 허용하지만 실제 값은 변경하지 않기 때문에 작동 undefined합니다.


답변

void 연산자를 사용하여 정의되지 않은 값을 얻을 수도 있습니다.

if (input !== void 0) {
    // do stuff    
}

(그리고 다른 대답에서 언급했듯이 변수가 선언되지 않으면 오류가 발생하지만이 경우 코드 검사 또는 코드 리팩토링 (예 : window.input !== void 0전역 변수 테스트 또는 추가 var input) 으로 배제 될 수 있습니다 .


답변

(typeof input !== 'undefined')이 시나리오에서 기본 기능 매개 변수를 제공하는 데 실제로 사용되는 경우 실제로 나왔습니다 .

function greet(name, greeting) {
  name = (typeof name !== 'undefined') ?  name : 'Student';
  greeting = (typeof greeting !== 'undefined') ?  greeting : 'Welcome';

  return `${greeting} ${name}!`;
}

greet(); // Welcome Student!
greet('James'); // Welcome James!
greet('Richard', 'Howdy'); // Howdy Richard!

ES6는 다음과 같이 기본 기능 매개 변수를 도입하는 새로운 방법을 제공합니다.

function greet(name = 'Student', greeting = 'Welcome') {
  return `${greeting} ${name}!`;
}

greet(); // Welcome Student!
greet('James'); // Welcome James!
greet('Richard', 'Howdy'); // Howdy Richard!

이것은 첫 번째 옵션보다 덜 장황하고 깨끗합니다.