Programming

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

procodes 2020. 2. 15. 23:28
반응형

변수가 존재하는지 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 ===)를 사용해야합니까?


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


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

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 이므로 값만 검사 합니다 .[]{}

아래 이미지를 작성하여 답변에 대한 간략한 간략한 정보를 표시합니다.

undefined, null 등


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

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


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

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

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


확인하십시오 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 values = typeof variable !== 'undefined' ? variable : '';

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

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

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

var values = variable ? variable : '';

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

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

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

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

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


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

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

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


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

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

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


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

또는 더 나은

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

모든 브라우저에서 작동


토론에 기여하기 위해 변수가 문자열 또는 항상 선호하는 객체 여야한다는 것을 알고 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)
} 


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


var _undefined;
var _null = null;

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


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

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

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

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

if (typeof elem === 'undefined')

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

elem = elem || defaultElem;

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

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

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

typeof연산자 를 사용할 수 있습니다 .

예를 들어

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

위의 코드 스 니펫은 다음과 같은 출력을 반환합니다.

변수 dataSet는 정의되지 않았습니다.


이 답변 (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 )를 제공 합니다. 필요한 설명.


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

typeof window.console === "undefined"

~와 동일하다

window.console === undefined

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

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

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


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

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로 변경됩니다.


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

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

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

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

내 선호는 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)


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

로도 코드를 함수로 추출하는 방법을 찾지 못했습니다 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");
}

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

다음은 몇 가지 추가 변형을 사용하는 것입니다. 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!

참고 URL : https://stackoverflow.com/questions/519145/how-can-i-check-whether-a-variable-is-defined-in-javascript



반응형