정의되지 않은 매개 변수 등을 확인하는 JavaScript 코드가 종종 있습니다.
if (typeof input !== "undefined") {
// do stuff
}
형식 조회와 문자열 비교가 포함되어 있기 때문에 다소 낭비 적입니다. undefined
이름을 바꿀 수 있기 때문에 필요합니다 .
내 질문은 :
이 코드는이 접근법보다 나은 방법입니다.
if (null != input) {
// do stuff
}
내가 아는 한 재정의 할 수 없으므로 null
예기치 않게 중단되지 않습니다. 그리고, !=
연산자 의 타입 강제 때문에 , 이것은 당신이 원하는 것 (예를 들어 선택적 함수 매개 변수) undefined
과 null
정확히 같은 것을 모두 검사합니다 .
그러나이 형식은 널리 퍼져 있지 않으며, 악의 !=
연산자 를 사용하는 것에 대해 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!
이것은 첫 번째 옵션보다 덜 장황하고 깨끗합니다.