변수가 존재하는지 JavaScript 확인 ​​(정의 / 초기화)


1763

변수가 초기화되었는지 확인하는 방법은 무엇입니까? (변수가 어떤 것을 가질 수 있다고 가정하면 (문자열, 정수, 객체, 함수 등))

if (elem) { // or !elem

또는

if (typeof(elem) !== 'undefined') {

또는

if (elem != null) {

5
당신이 있는지 여부를 확인할 수 foo중, 선언 typeof foo === 'undefined'또는typeof foo === typeof undefined

1
고도로 선의적인 답변은 선언되었지만 값이있는 변수에는 작동하지 않습니다 undefined. 정답은 이것입니다 : stackoverflow.com/a/36432729/772035
Paul

@Paulpro, 버전 사용하여 hasOwnProperty('bar')다른 사람과 같은 결함을 가지고 있지 않지만, 노드 (교체에 대한 몇 가지 조정을 필요 windowglobal).
oligofren

@Paulpro 실제로, 나는 당신이 대답하기 전에 그 생각이 실제로 실제적인 문제는 아니라는 결론을 내 렸습니다. 블록 또는 함수 범위 변수를 처리 할 때는 일반적으로 소유하거나 코드에 액세스 할 수있는 코드이므로 언제든지 수정 가능한 런타임 오류가 발생합니다. 정의되지 않은 (존재하지 않는) 변수의 일반적인 문제는 일반적으로 제어 외부의 코드에 있기 때문에이를 감지하는 방법이 필요합니다. 이것이 80/20 솔루션입니다.
oligofren

답변:


3052

당신 typeof연산자를 원한다 . 구체적으로 특별히:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
이것은 좋은 해결책으로 보이지만 이것이 왜 효과가 있는지 설명 할 수 있습니까?
Morgan Cheng

46
실제로, 객체가 필요한 것인지 확인해야합니다. 따라서 if (typeof console == 'object') {// 변수는 내가 필요로하는 것}
staticsan

59
@George IV : "그냥`if (variable)"-음, 아니, 그것은 거짓과 0에 실패합니다.
Jason S

17
'if (variable)'도 객체 속성이 있는지 테스트하는 데 실패합니다.
scotts

54
@ geowa4 실제로 변수가 정의되어 있지 않으면 오류가 발생합니다.
kevinji

856

typeof변수가 정말 정의되지 않은 경우 운영자는 확인합니다.

if (typeof variable === 'undefined') {
    // variable is undefined
}

typeof작업자는 다른 사업자 달리 버리지 않는 하면 ReferenceError 미표시 변수와 함께 사용하면 예외.

그러나을 typeof null반환 한다는 점에 유의하십시오 "object". 변수를로 초기화하는 실수를 피해야합니다 null. 안전을 위해 대신 사용할 수 있습니다.

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

===단순 동등성 대신 엄격한 비교를 사용하는 방법에 대한 자세한 내용 ==다음을 참조하십시오.
JavaScript 비교에 어떤 equals 연산자 (== vs ===)를 사용해야합니까?


2
if (! variable_here) {// 여기 코드입니다. }; 변수가 거짓인지 정의되지 않았는지 알 수 없음
boh

5
if(! variable_here)많은 경우에 깨질 것입니다. 변수가 0 또는 false이면 실패합니다. 그것은 당신이 원하는 것이 아닙니다.
Cory Danielson

2
투표 할 것인지 결정할 수 없습니다. 엄밀히 말하면 typeof foo === "undefined"정답이며 최고 투표 답변보다 낫지 만 추가 메모는이 답변을 혼란스럽게 만듭니다.
Alnitak

1
@StevenPenny 타임 라인을 확인하십시오. 이 답변이 게시 된 후 다른 답변 에서 최상위 답변이 병합 되었습니다.
Rob

1
이 답변은 효과가 없습니다. 이것은 여기에서 작동하는 유일한 대답입니다. stackoverflow.com/a/36432729/772035
Paul

222

대부분의 경우 다음을 사용합니다.

if (elem) { // or !elem

당신을 위해 일을 할 것입니다 .... 이것은 아래의 경우를 확인합니다 :

  1. undefined : 값이 정의되어 있지 않은 경우undefined
  2. null : null 인 경우, 예를 들어 DOM 요소가 존재하지 않는 경우
  3. 빈 문자열 :''
  4. 0 : 숫자 0
  5. NaN : 숫자가 아님
  6. 그릇된

따라서 모든 경우를 다루지 만 항상 공백이있는 문자열과 같이 항상 이상한 경우가 있습니다.이 문자열과 같이 공백이있는 문자열은 문자열 ' '안에 공백이 있으므로 자바 스크립트로 정의됩니다 ... 예를 들어이 경우에는 다음과 같이 trim ()을 사용하여 하나 이상의 검사를 추가합니다.

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

또한 이러한 검사는 Javascript에서 객체와 배열이 다르게 작동하므로 빈 배열 과 빈 개체 는 항상 true 이므로 값만 검사 합니다 .[]{}

아래 이미지를 작성하여 간단한 답변을 보여줍니다.

정의되지 않은, null 등


2
@Alireza, 좋은! 당신의 대답은 많은 사람들을 도울 것입니다. 나는 이미이 잘못된 값들을 기억했다. 확실하지 않은 유일한 것은 []에 관한 것이었다.
Thiago Yoithi

13
"ReferenceError : elem is not defined"가 나타납니다.
ropo

3
@ropo, 그것은 당신이 그것의 내용을 확인하기 위해 elem을 정의하지 않았기 때문입니다. 만약 당신의 경우라면, 당신은 이미 언급 된 typeof (elem) === "string"으로 그것을 확인해야합니다.
Alireza

19
그런 다음 대답은 if(elem)정의되지 않은 오류를 반환하는 동안 정의되지 않은 검사를 할 때 오도의 소지 가 있습니까?
Fanky

1
변수가 정의되지 않았는지 여부와 정의되지 않은 값으로 정의되어 있는지 확인하는 유스 케이스를 제공합니까? 당신 중 일부는 빨대를 잡고 눈에 띄게 보이려고하지만 값을 정의되지 않은 것으로 설정하고 그 값을 분명히 확인하면 거짓을 반환하거나 코드를 변경해야합니다. smh ....이 대답은 정확합니다! !!!
almcaffee

210

JavaScript에서는 변수를 정의 할 수 있지만 값을 보유 undefined하므로 가장 일반적인 대답은 기술적으로 정확하지 않으며 대신 다음을 수행합니다.

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

그것은 당신의 목적에 충분할 수 있습니다. 다음 테스트는 시맨틱이 더 단순하여 코드의 동작을 정확하게 설명하고 이해하는 것이 더 쉽습니다.

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

물론 이것은 브라우저에서 실행중인 것으로 가정합니다 (여기서는 window전역 객체의 이름 임). 그러나 이와 같은 글로벌 사용자를 모색하고 있다면 아마도 브라우저에있을 것입니다. 주관적으로, 사용 'name' in windowwindow.name글로벌을 참조하기 위해 사용 하는 것과 문체 적으로 일치 합니다. 변수가 window아닌 속성으로 전역에 액세스 하면 코드에서 참조하는 선언되지 않은 변수의 수를 최소화 할 수 있으며 (보 풀림의 이점을 위해) 전역 변수가 지역 변수에 의해 가려 질 가능성을 피할 수 있습니다. 또한 전 세계 사람들이 피부를 크롤링하면 비교적 긴 스틱으로 만 피부를 만지는 것이 더 편할 것입니다.


7
변수가 전역 적으로 선언되었는지 확인합니다. 제대로 코딩하면 전역 변수가 제한됩니다. 로컬 var에 대해 false를보고합니다. (function () {var sdfsfs = 10; console.log ( "sdfsfs"in window);}) ()`
Eddie Monge Jr

2
이것은 가장 좋은 f $ # ^ % ing 답변입니다. 나는 이 코너 사건 을 정확하게 설명하는 방법을 알아 내려고 노력하면서 이것에 재치가있었습니다 . 훌륭한. 당신이 이것을 할 수 있는지 몰랐습니다.
temporary_user_name

1
헤즈 업 : 귀하의 답변이 stackoverflow.com/questions/519145/…
Shog9

Angular 사용자의 경우 : 불행히도 ng-if 문에서는 허용되지 않는 것 같습니다.
qwertzguy

... 범위에 따른 점검을위한 완벽한 청사진. "in window"또는 "(typeof variable === 'undefined'|| variable === null)"인 경우 성능 표시가 있습니까? 사실은 내가 하드 사실 테스트하지 argumented 잠재적 인 근거에 관심이 있어요 (I 자신을 할 수있는 : 두 번째 절은 더 작업이 -> 더 성능)
신속한

119

대부분의 경우 다음을 사용합니다.

elem != null

간단한 달리 if (elem), 그것은 수 0, false, NaN그리고 ''있지만, 거부 null또는 undefined객체의 인수의 존재, 또는 속성에 대한 그것에게 좋은 일반적인 테스트를 만드는.


다른 검사도 잘못된 것이 아니며 다른 용도로만 사용됩니다.

  • if (elem)다음과 같은 경우에 사용될 수있는 elem오브젝트를 보장 경우, 또는 false, 0등 (이에 상당 "기본"값으로 간주 undefined하거나 null).

  • typeof elem == 'undefined'지정된 null변수가 초기화되지 않은 변수 나 속성에 고유 한 의미를 갖는 경우에 사용할 수 있습니다 .

    • 선언 되지 않은 경우 오류가 발생하지 않는 유일한 검사입니다 (예 : 명령문이 없거나 속성이 아니거나 함수 인수가 아님). 제 생각에는 오타가 눈에 띄지 않게 미끄러지기 때문에 다소 위험합니다. 이를 피하려면 아래 방법을 참조하십시오.elemvarwindow

또한 다음에 대한 엄격한 비교가 유용합니다 undefined.

if (elem === undefined) ...

그러나 전역 undefined이 다른 값으로 재정의 될 수 있으므로 변수 undefined를 사용하기 전에 현재 범위에서 변수를 선언하는 것이 가장 좋습니다 .

var undefined; // really undefined
if (elem === undefined) ...

또는:

(function (undefined) {
    if (elem === undefined) ...
})();

이 방법의 두 번째 장점은 JS 축소 기가 undefined변수를 단일 문자로 줄여 매번 몇 바이트를 절약 할 수 있다는 것입니다.


17
재정의 할 수 있다는 것에 충격을 받았습니다 undefined. 나는 그것이 대답에서 언급 할 가치가 있다고 생각하지 않습니다. 아마도 모든 Javascript에서 최악의 단일 허용 변수 이름 일 것입니다.
Cory Danielson

2
이로 인해 예외가 발생하고 window.전역 컨텍스트에서 사용되는 경우 변수보다 먼저 사용해야 합니다 ... 이것이 최선의 방법은 아닙니다.
Alex W

4
이 우선적 인 문제 때문에 항상 void(0)대신에 사용해야 합니다 undefined.
Bartłomiej Zalewski

그 밖에이 답변 포인트 이후 +1 때때로 당신은 실제로 수 있습니다 원하는 식별하기 위해 false, 0유효하지 않은 값으로, 등.
rinogo

77

확인하십시오 window. hasOwnProperty( " varname" )

과다한 typeof답변 에 대한 대안 ;

var varname = value;전역 범위에서 명령문으로 선언 된 전역 변수

창 개체의 속성으로 액세스 할 수 있습니다.

따라서 hasOwnProperty()방법은

객체가 지정된 속성을 자체 속성으로 가지고 있는지 여부를 나타내는 부울을 반환합니다 (상속하는 것이 아니라).

여부를 결정하는 데 사용할 수 있습니다

var"변수 varName는" 전 세계적으로 선언 된 의 한 속성입니다 window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

가장 좋은 hasOwnProperty()점은 호출 할 때 아직 선언되지 않은 변수를 사용하지 않는다는 것입니다. 물론 처음에는 절반의 문제입니다.

항상 완벽 하거나 이상적인 솔루션 은 아니지만 특정 상황에서는 그저 직업 일뿐입니다!

노트

위의 내용은 var다음 과 달리 변수를 정의하는 데 사용할 때 적용됩니다let .

블록 범위 로컬 변수를 선언하고 선택적으로 값으로 초기화합니다.

와 달리 var블록 범위와 상관없이 전체 함수 또는 전체 함수에 변수를 정의하는 키워드 .

최상위 수준의 프로그램 및 함수 let에서는와 달리 var전역 객체에 대한 속성을 만들지 않습니다.

완전성 : const 상수는 정의에 따라 실제로는 가변적이지 않습니다 (그 내용은 다를 수 있음) 더 관련성 :

전역 상수는 달리 윈도우 객체의 속성이되지 않습니다. var 변수 . 상수의 이니셜 라이저가 필요합니다. 즉, 선언 된 동일한 명령문에 값을 지정해야합니다.

상수 값은 재 할당을 통해 변경할 수 없으며 다시 선언 할 수 없습니다.

const 선언은 값에 대한 읽기 전용 참조를 만듭니다. 변수 식별자를 재 할당 할 수 없다는 것만으로 보유한 값이 변경 불가능하다는 의미는 아닙니다.

때문에 let변수 나 const상수가 상속 한 모든 개체의 속성 결코 hasOwnProperty()방법, 자신의 존재를 확인하는 데 사용할 수 없습니다.

가용성과 사용에 관하여 hasOwnProperty():

Object의 자손은 메소드를 상속합니다 hasOwnProperty(). [...] in연산자 와 달리이 방법은 객체의 프로토 타입 체인을 검사하지 않습니다.


1
이것은 굉장한 대안 이며이 질문의 상단에 있어야합니다. true(예 : window.hasOwnProperty('console')또는 var hop = "p";window.hasOwnProperty('hop')) 를 반환하는 실제 예제를 사용하여 답변 헤드 라인을 단순화하십시오 .
CPHPython

2
마지막으로 존재하지 않는 멤버에 액세스하여 오류가 발생하지 않는 문제… 모든 typeof답변이 간과됩니다.
Zelphir Kaltstahl

1
이 답변은 구식입니다. 표준 ECMAScript에 따라 let이러한 변수를 사용할 수없는 곳 window(또는 다른 사용 가능한) 객체의 속성으로 변수를 정의 할 수 있습니다 . 변수가 아닌 속성의hasOwnProperty 존재 여부를 테스트하여로 정의 된 변수를 감지하는 데 사용할 수 없습니다 . let
amn 2016 년

1
@amn 대답은 구식이 아니라 사용에 관한 진실로 남아 var있습니다. 그러나의 사용법 letconst차이점을 간략히 설명하는 메모를 추가했습니다 var. 영감을 주셔서 감사합니다. 우리가 함께 :) 상승
프레드 Gandt에게

1
@amn 변수 hasOwnProperty의 존재를 확인하기 위해 처방 된 방식으로 만 사용할 수 있음을 더 명확하게하기 위해 대답을 다시 작성했습니다 (마지막으로) var. 괜찮아요
Fred Gandt

68

변수가 존재하는지 확인하는 방법

이것은 변수가 존재하고 초기화되었는지 테스트하기위한 방탄 솔루션입니다.

var setOrNot = typeof variable !== typeof undefined;

특정 변수가 초기화되지 않은 경우 기본값을 설정하기 위해 삼항 연산자 와 함께 가장 일반적으로 사용됩니다 .

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

캡슐화 문제

불행히도, 단순히 체크를 함수로 캡슐화 할 수는 없습니다.

다음과 같은 일을 생각할 수 있습니다.

function isset(variable) {
    return typeof variable !== typeof undefined;
}

그러나 예를 들어 호출하면 참조 오류가 발생합니다. isset(foo)변수 foo가 존재하지 않는 변수를 함수에 전달할 수 없으므로 변수 가 정의되지 않았습니다.

잡히지 않은 ReferenceError : foo가 정의되지 않았습니다


함수 매개 변수가 정의되지 않았는지 테스트

우리 반면 isset함수는 변수 (이유 hereabove 설명을위한)의 존재 여부 테스트에 사용할 수 없습니다, 그것은 함수의 매개 변수가 정의되지 여부를 테스트 우리를 허용하지 :

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

에 대한 값이 비록 y기능에 전달되지 않습니다 test, 우리 isset때문에 기능은 이러한 맥락에서 완벽하게 작동 y기능에 알려진 testint로서 undefined값.


41

간단한 할당 및 관련 확인을 수행 할 때이를 확인하는 또 다른 간단한 방법이 있습니다. 간단하게 사용 조건부 (삼항) 연산자.

var values = typeof variable !== 'undefined' ? variable : '';

참조 변수의 인스턴스 할당으로 전역 변수를 선언하려고 할 때도 유용합니다.

변수를 확인하려면 undefined또는 이 아니어야합니다 null. 그런 다음 아래 확인을 수행하십시오.

변수가 선언되고 값을 확인하려면 간단 합니다. 함께 수행 undefined하고 null함께 확인합니다.

var values = variable ? variable : '';

평평하지 않은 대답. typeof 변수는 항상 문자열을 반환하므로 절대 거짓이 아닙니다. 예를 들어 다음과 같은 경우 typeof(booooo)입니다 "undefined"다음 typeof(typeof boooooo)입니다 "string"typeof boooooo && true항상 true. @ John-Slegers의 대답은 typeof로 얻을 수있는 약자입니다.
mpag

정답 입니다. 여기에 작동하는 바이올린이 있습니다. 그리고 나는 당신이 말하는 시나리오를 모른다. 문제는 변수 존재를 확인하는 것입니다.
RajeshKdev

@mpag 평평하지 않다. 그것을 증명하십시오 . 실수를 찾는 것은 정말 쉽습니다, 대신 여기에 좋은 답변을 제공 할 수 있습니다 !!!. 정답이 틀렸다면 28 명의 프로그래머가 내 대답을 확인하지 않고 투표를하지 않았을 것입니다. 여기에 많은 평판이 좋은 답변이 있기 때문에 그들은 이것을 투표하지 않았습니다.
RajeshKdev

실제로 두 번째 코드는 위의 조건과 동일하지 않습니다. 나는 사람들 이이 줄로 이해할 것이라고 생각했다 If you wanted to check variable shouldn't be undefined or null.. 변수 값을 확인하는 것입니다.
RajeshKdev

1
당신의 두번째 검사는 0 값을 실패합니다
파리 드 자카 Alnamrouti에게

32

변수를 테스트하는 간단한 방법은 선언되어 있지 않습니다 (정의되지 않음).

if (typeof variable === "undefined") {
  ...
}

브라우저 외부에서 실행되는 스크립트를 감지하는 데 유용합니다 ( window변수 를 선언하지 않음 ).


이것이 휴대용 인 "정식적인 방법"입니까?
Jason

3
이것은 잘못이다. window.bar=undefined정의되고 값으로 설정됩니다. 변수가 존재하지 않는 경우와 대답이이 차이를 감지하지 못합니다. 그랬다면 this.hasOwnProperty('bar')효과가 있었을 것입니다.
oligofren

이 코드는 작동하지 않으며 브라우저 콘솔을 사용하여이를 확인할 수 있습니다
ha9u63ar

1
고려하십시오 const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. 변수 x가 정의되었지만 false가 리턴됩니다.
user2878850

29

변수가 정의되었는지 관심이 있는지 또는 의미있는 값을 갖기를 원하는지에 따라 다릅니다.

유형이 정의되지 않았는지 확인하면 변수가 아직 정의되어 있는지 확인합니다.

=== null또는 !== null변수 값이 정확히 맞는지 확인합니다 null.

== null또는 != null값이 undefined또는 인지 확인합니다 null.

if(value)변수가 있는지 확인합니다 undefined, null, 0, 또는 빈 문자열.


12

가장 좋은 대답은 맞습니다. typeof를 사용하십시오.

그러나 내가 지적하고 싶었던 것은 JavaScript undefined에서 변경할 수 없다는 것입니다 (불경건 한 이유로). 따라서 단순히 검사 만하면 varName !== undefined예상대로 항상 반환되지 않을 가능성이 있습니다. 다른 라이브러리는 정의되지 않은 상태로 변경되었을 수 있기 때문입니다. 몇 가지 답변 (@ skalee 's)은을 사용하지 않는 것을 선호 typeof하며 문제가 발생할 수 있습니다.

이것을 처리하는 "오래된"방법은의 잠재적 인 뮤팅 / 과잉을 상쇄하기 위해 undefined를 var로 선언하고있었습니다 undefined. 그러나 가장 좋은 방법은 다른 코드에서 typeof재정의하는 것을 무시하므로 여전히 사용 하는 것 undefined입니다. 특히 페이지에서 무엇이 실행될 수 있는지 아는 사람이있는 곳에서 사용할 코드를 작성하는 경우 ...


1
varName이 정의되어 있지 않으면 varName !== undefinedReferenceError가 발생 하기 때문에 요점은 무의미 합니다. 의 변경 가능성은 undefined중요하지 않습니다.
Wutaz

헤즈 업 : 귀하의 답변이 stackoverflow.com/questions/519145/…
Shog9

1
최신 Javascript 버전 undefined은 읽기 전용 속성입니다. 그러나 방탄을 위해 사용할 수 있습니다 typeof mvVar === typeof void 0. 항상 void 0반환 undefined합니다.
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

또는 더 나은

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

모든 브라우저에서 작동


3
왜 후자가 귀하의 의견에 더 좋습니까?
skalee

3
@skalee 나는 후자가 더 낫다는 데 동의합니다. 유형이 사용하기 전에 원하는 유형인지 확인하는 간단한 이유입니다.
Broxzier

헤즈 업 : 귀하의 답변이 stackoverflow.com/questions/519145/…
Shog9

9

토론에 기여하기 위해 변수가 문자열 또는 항상 선호하는 객체 여야한다는 것을 알고 if (!variable)있다면 거짓인지 확인하십시오. 이를 통해보다 깨끗한 코드를 얻을 수 있습니다. 예를 들면 다음과 같습니다.

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..로 줄일 수 있습니다 :

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


이것은 OP가 요구 한 것이 아닙니다. data.url이 ''솔루션 과 동일하면 실제로 빈 문자열을 포함하는 것으로 정의 된 경우 정의되지 않은 것으로 간주합니다.
Demonblack

나는 요청한 것이 아니며 동의합니다. 빈 문자열 ''은 정의되지 않은 것으로 간주됩니다. 그러나 나는 다른 답변들 사이에서 만들어진 토론에 유용 할 수 있다고 생각했기 때문에 이것을 게시했습니다. 실제로 내용이있는 경우 그 사실을 활용하는 확인 그래서 그리고 예에서뿐만 아니라, 다른 많은 경우에, 당신은 자바 스크립트가 모두 빈 문자열을 falsy 고려하고 정의되지 않은 문자열을 인쇄 할
DE3

8

undefined와 null을 구분하기는 어렵습니다. Null 은 변수에 특정 값이 없음을 나타내려는 경우 변수에 할당 할 수있는 값입니다. 정의되지 않음 은 할당되지 않은 변수의 기본값이되는 특수 값입니다.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
각 경고의 출력을 인라인으로 표시하는 데 도움이됩니다.
demisx

@demisx 동의하지만 편집을 제안하는 대신 왜 편집하지 않겠습니까? 옵션은 이유가 있습니다. 어떤 사람들은 그것이 무례하다고 생각할 수도 있습니다. 나는 그것이 효율적이라고 생각합니다-그래서 답을 직접 편집했습니다 (검토 보류 중).
Fred Gandt 2016 년

1
@Fred-편집 기록을 살펴본 결과 출력이 무엇인지 보여주기 위해 행을 추가하는 대신 편집이 거부 된 이유를 추측 할 수 있습니다. demisx가 제안한 것처럼 Jith가 게시 한 내용을 크게 변경했습니다.
Stephen P

8

널은 자바 스크립트에서 값 typeof null반환"object"

따라서 null 값을 전달하면 허용되는 답변이 작동하지 않습니다. null 값을 전달하면 null 값을 추가로 확인해야합니다.

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

가장 강력한 '정의 된'검사는 typeof

if (typeof elem === 'undefined')

정의 된 변수를 확인하여 기본값을 할당하는 경우 하나의 라이너를 쉽게 읽을 수 있도록 종종 다음을 수행 할 수 있습니다.

elem = elem || defaultElem;

자주 사용하는 것이 좋습니다. 자바 스크립트에서 기본값을 설정하는 관용적 방법

typeof 키워드를 사용하는이 라이너도 있습니다 .

elem = (typeof elem === 'undefined') ? defaultElem : elem;


7

변수가 선언 / 설정되었는지 확인하기 위해이 더러운 트릭을 수행했습니다.

로도 코드를 함수로 추출하는 방법을 찾지 못했습니다 eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

"코드를 함수에 추출"한다는 것은 무엇을 의미합니까?
멜랩

7

이 답변 (Fred Gandt 솔루션 제외)은 모두 부정확하거나 불완전합니다.

내가 가치 variableName;를 지닐 필요가 있다고 가정 undefined하고, 따라서 var variableName;이미 초기화 된 것과 같은 방식으로 선언되었습니다 . -이미 신고되었는지 어떻게 확인합니까?

또는 더 나은 방법- "Book1.chapter22.paragraph37"이 단일 호출로 존재하지만 참조 오류가 발생하지 않는지 즉시 확인하려면 어떻게해야합니까?

가장 강력한 JasvaScript 연산자 인 in 연산자 를 사용하여 수행합니다 . :

"[variable||property]" in [context||root] 
>> true||false

AJAX의 인기가 가장 높은시기에 나는 "Book1.chapter22.paragraph37"과 같은 속성 이름에 대한 심층 테스트를 포함하여 네임 스페이스가 존재하는지 여부를 판별 할 수있는 isNS () 메소드를 작성했습니다.

그러나 이전에 게시되었으므로 매우 중요하기 때문에 별도의 스레드로 게시해야합니다. 여기에 게시하지는 않지만 소스 코드를 찾는 데 도움이되는 키워드 ( javascript + isNS )를 제공 합니다. 필요한 설명.


1
in- 연산자는 속성 존재를 테스트하고 모든 변수 속성은 다음 constlet선언은하지 않습니다 (그리고 const심지어 잘입니다 변수 ).
amn

1
constlet- 오늘 오히려 pervasively 사용되는 3 년 이상 전에 게시 된 이후 평소 용의자가 좋은 채택을 볼 수 있으며, ECMAScript를 2015 년에 표준화 된, 내가 감히 Github에서의 "CONST"의 2 개 백만 개 이상의 발생이 JS 파일에서 .
amn

예, "가변"-정확히. 난 당신이 지적, 당신의 대답에 댓글을 이유는 없다 사용 in되든지 관계없이 일반적으로 테스트 연산자를 변수 동안 - 존재하기 때문에 "const를하고 [속성]을하지 않은하자" const참으로 소개 말할 수있다 일정의 참조로, 반면에 변수 참조와 let반대로, 실제로 변수 참조를 도입합니다. 즉, 어떤 식 으로든 변수이며 변수는로 정의 된 변수가 let존재 하는지 여부를 테스트 할 수 있다는 의미에서 부정확 합니다 in연산자 를 사용하면 불가능합니다.
amn 2016 년

ECMAScript 6 사양 은 사용자 나 웹 브라우저가 아닌 JavaScript 언어를 정의합니다. 이것이 바로 스펙 이라고 불리는 이유 입니다. 언어를 명확하게 지정합니다. 당신의 대답은 최악의 의도적 무엇을 생략하고, 오래된 최고에 있습니다 당신은 매우 많은 관련이 있지만, 관련이없는 고려한다. 링크 된 스펙을 인용하면 "let 및 const 선언은 변수를 정의합니다". 이 구문은 window객체의 속성으로 액세스 할 수 없으므로이를 더 명확하게하는 방법을 모르겠습니다.
amn

답은 모든 경우에 적용되지는 않습니다. 특히 let키워드로 정의 된 변수는 다루지 않습니다 . 그것이 내가 지적한 전부입니다.
amn

6

질문에 요약 된 특정 상황에서

typeof window.console === "undefined"

~와 동일하다

window.console === undefined

나는 더 짧기 때문에 후자를 선호합니다.

console전역 범위 ( window모든 브라우저 의 개체) 에서만 검색합니다 . 이 특별한 상황에서는 바람직하다. console다른 곳에서는 정의 하고 싶지 않습니다 .

@BrianKelley는 그의 훌륭한 답변에서 기술적 세부 사항을 설명합니다. 나는 결론이 결여되어 있고 읽기 쉬운 것으로 요약했다.


헤즈 업 : 귀하의 답변이 stackoverflow.com/questions/519145/…
Shog9

2
그릇된. 후자는 내 콘솔에서 예외를 throw합니다.
john ktejik

6

객체에 따라 두 가지 방법을 사용합니다.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

때로는 빈 문자열을 거짓으로 평가하고 싶지 않으므로이 경우를 사용합니다.

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

반대로 필요한 경우 첫 번째 인스턴스에서! variable은 !! variable이되고 유효하지 않은 함수는 ===가! =가되고 함수 이름은 notInvalid로 변경됩니다.


5

내 선호는 typeof(elem) != 'undefined' && elem != null입니다.

그러나 선택하면, 체크를 기능에 넣는 것을 고려하십시오.

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

변수가 선언되었는지 모르는 경우 계속하십시오. typeof (x) != 'undefined' && x != null;

변수가 선언되었지만 존재하지 않을 수 있음을 알고 있다면

existy(elem) && doSomething(elem);

확인중인 변수는 때때로 중첩 속성 일 수 있습니다. prop ||를 사용할 수 있습니다 {} 해당 부동산에 대한 라인 검사 존재 여부를 아래로 내리려면 :

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

각 속성 후에 (... '|| {}'). nextProp를 사용하면 누락 된 속성이 오류를 발생시키지 않습니다.

또는 당신은 같은 존재를 사용할 수 있습니다 existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


함수에 넣으면 중복됩니다. when 가 선언 된 typeof (x) != 'undefined' && x != null것과 같습니다 . x != nullx
Ry-

3

상황에 따라 다릅니다. jQuery와 같이 코드 외부에서 정의되지 않았거나 정의되지 않은 것을 확인하려는 경우 다음을 원합니다.

if (typeof(jQuery) != "undefined")

(엄격한 동등성이 필요하지 않은 경우 typeof는 항상 문자열을 반환합니다.) 그러나 전달되거나 전달되지 않은 함수에 대한 인수가 있으면 항상 정의되지만 생략하면 null입니다.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

시험해보기

변수가 전혀 정의되지 않은 경우 다음과 같이 try-catch 블록을 사용하여 중단 코드 실행없이이를 확인할 수 있습니다 ( use strict모드 필요 없음 ).

보너스 : (다른 답변 참조) ( source ) ===보다 더 명확한 이유==

if (a == b)

여기에 이미지 설명을 입력하십시오

if (a === b)

여기에 이미지 설명을 입력하십시오


1
참고로 Game of Life 그리드에 배치 된 (a == b)는 그다지 흥미 진진하지 않았습니다.
johnsnails

0

아직 언급되지 않은 것이 놀랍습니다 ...

다음은 몇 가지 추가 변형을 사용하는 것입니다. this['var_name']

이 방법을 사용하면 변수를 정의하기 전에 사용할 수있는 이점이 있습니다.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

이것은 잘못이다. window.bar=undefined정의되고 값으로 설정됩니다. 변수가 존재하지 않는 경우와 대답이이 차이를 감지하지 못합니다. 그랬다면 this.hasOwnProperty('bar')효과가 있었을 것입니다.
oligofren

0

다음과 같이 try ... catch 블록을 사용할 수 있습니다.

단점은 ReferenceError를 발생시킬 수 있으므로 함수에 넣을 수 없다는 것입니다

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.