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

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

if (elem) { // or !elem

또는

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

또는

if (elem != null) {



답변

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

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


답변

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 ===)를 사용해야합니까?


답변

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

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 등


답변

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아닌 속성으로 전역에 액세스 하면 코드에서 참조하는 선언되지 않은 변수의 수를 최소화 할 수 있으며 (보 풀림의 이점을 위해) 전역 변수가 지역 변수에 의해 가려 질 가능성을 피할 수 있습니다. 또한 전 세계 사람들이 피부를 크롤링하면 비교적 긴 스틱으로 만 피부를 만지는 것이 더 편할 것입니다.


답변

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

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변수를 단일 문자로 줄여 매번 몇 바이트를 절약 할 수 있다는 것입니다.


답변

확인하십시오 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연산자 와 달리이 방법은 객체의 프로토 타입 체인을 검사하지 않습니다.


답변

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

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

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값.