변수가 초기화되었는지 확인하는 어떤 방법이 더 나은/올바릅니까? (변수가 무엇이든 담을 수 있다고 가정합니다(문자열, 정수, 객체, 함수 등))
if (elem) { // or !elem
또는
if (typeof elem !== 'undefined') {
또는
if (elem != null) {
질문자 :Samuel Liew
변수가 초기화되었는지 확인하는 어떤 방법이 더 나은/올바릅니까? (변수가 무엇이든 담을 수 있다고 가정합니다(문자열, 정수, 객체, 함수 등))
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 예외를 throw하지 않습니다.
그러나 typeof null
은 "object"
반환합니다. null
로 초기화하는 실수를 피하기 위해 주의해야 합니다. 안전을 위해 다음을 대신 사용할 수 있습니다.
if (typeof variable === 'undefined' || variable === null) { // variable is undefined or null }
단순 같음 ==
===
사용에 대한 자세한 내용은 다음을 참조하세요.
JavaScript 비교에서 어떤 등호 연산자(== vs ===)를 사용해야 합니까?
많은 경우 다음을 사용합니다.
if (elem) { // or !elem
당신을 위해 일을 할 것입니다!... 이것은 아래의 경우를 확인할 것입니다:
undefined
''
그래서 그것은 모든 경우를 덮을 것이지만 우리가 다루고 싶은 이상한 경우도 항상 있습니다. 예를 들어 공백이 있는 문자열, 예를 들어 이 ' '
와 같이 공백이 있으므로 자바스크립트에서 정의됩니다. 내부 문자열... 예를 들어 이 경우 다음과 같이 trim()을 사용하여 검사를 한 번 더 추가합니다.
if(elem) { if(typeof elem === 'string' && elem.trim()) { ///
또한 이러한 검사는 값에 대해서만 수행됩니다. Javascript에서 객체와 배열이 다르게 작동하기 때문에 빈 배열 []
및 빈 객체 {}
는 항상 true 입니다.
답변에 대한 간단한 요약을 보여주기 위해 아래 이미지를 만듭니다.
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 window
을 사용하는 것은 전역을 참조하기 위해 window.name
을 사용하는 것과 스타일적으로 일치합니다. window
속성으로 전역에 액세스하면 코드에서 참조하는 선언되지 않은 변수의 수를 최소화할 수 있고(린트의 이점을 위해) 전역이 지역 변수에 의해 가려지는 가능성을 피할 수 있습니다. 또한 전역이 피부를 기어 다니게 하면 이 비교적 긴 막대기로만 피부를 만지는 것이 더 편안할 것입니다.
대부분의 경우 다음을 사용합니다.
elem != null
if (elem)
과 달리 0
, false
, NaN
및 ''
는 허용하지만 null
또는 undefined
거부하므로 인수 또는 객체 속성의 존재 여부에 대한 좋은 일반적인 테스트가 됩니다.
다른 검사도 올바르지 않으며 용도가 다를 뿐입니다.
if (elem)
elem
이 객체로 보장되거나 false
, 0
등이 "기본" 값으로 간주되는 경우 사용할 수 있습니다 undefined
또는 null
과 동일).
typeof elem == 'undefined'
null
이 초기화되지 않은 변수나 속성에 대해 고유한 의미를 갖는 경우에 사용할 수 있습니다.
elem
이 선언 되지 않은 경우 오류를 발생시키지 않는 유일한 검사입니다(즉, var
문이 없거나 window
의 속성이 아니거나 함수 인수가 아님). 제 생각에 이것은 오타가 눈에 띄지 않게 미끄러질 수 있기 때문에 다소 위험합니다. 이를 방지하려면 아래 방법을 참조하십시오. 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()
메서드는
객체가 지정된 속성을 고유한 속성으로 가지고 있는지 여부를 나타내는 부울을 반환합니다(상속과 반대).
여부를 결정하는 데 사용할 수 있습니다.
"varname" 의 var
가 전역적으로 선언되었습니다. 즉 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()
의 좋은 점은 호출할 때 아직 선언되지 않은 변수를 사용하지 않는다는 것입니다. 물론 처음에는 절반의 문제입니다.
항상 완벽 하거나 이상적인 솔루션은 아니지만 특정 상황에서는 단지 작업일 뿐입니다!
let
which 와 달리 var
를 사용하여 변수를 정의할 때 위의 내용이 사실 입니다.
블록 범위 지역 변수를 선언하고 선택적으로 값으로 초기화합니다.
변수를 전역적으로 정의하거나 블록 범위에 관계없이 전체 함수에 대해 로컬로 정의하는
var
키워드와 다릅니다.프로그램 및 함수의 최상위 수준에서
let
var
와 달리 전역 객체에 속성을 생성하지 않습니다.
완전성을 위해: const
상수는 정의에 따라 실제로 가변적이지 않습니다(내용은 가변적일 수 있음). 더 관련성:
var
변수와 달리 창 개체의 속성이 되지 않습니다. 상수에 대한 초기화가 필요합니다. 즉, 선언된 동일한 명령문에서 해당 값을 지정해야 합니다.상수의 값은 재할당을 통해 변경할 수 없으며 재선언할 수 없습니다.
const 선언은 값에 대한 읽기 전용 참조를 만듭니다. 변수 식별자를 재할당할 수 없다는 것이지 보유하고 있는 값이 변경 불가능하다는 의미는 아닙니다.
let
변수나 const
hasOwnProperty()
메서드를 상속받은 객체의 속성이 아니므로 존재를 확인하는 데 사용할 수 없습니다.
hasOwnProperty()
의 가용성 및 사용에 관하여:
후손 모든 개체 개체 상속
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
함수는 변수가 존재하는지 여부를 테스트하는 데 사용할 수 없지만(위에서 설명한 이유 때문에), 함수의 매개변수가 정의되지 않았는지 여부를 테스트할 수 있습니다.
var a = '5'; var test = function(x, y) { console.log(isset(x)); console.log(isset(y)); }; test(a); // OUTPUT : // ------------ // TRUE // FALSE
y
에 대한 값이 function test
isset
함수는 이 컨텍스트에서 완벽하게 작동합니다. y
는 function test
에서 undefined
값으로 알려져 있기 때문입니다.
변수를 테스트하는 짧은 방법은 선언되지 않음(정의되지 않음)입니다.
if (typeof variable === "undefined") { ... }
window
변수를 선언하지 않음)를 감지하는 데 유용하다는 것을 알았습니다.
간단한 할당 및 관련 검사를 수행할 때 이를 확인하는 또 다른 간단한 방법이 있습니다. 조건부(삼항) 연산자를 사용하기만 하면 됩니다.
var values = typeof variable !== 'undefined' ? variable : '';
또한 이것은 참조 변수의 인스턴스 할당으로 전역 변수를 선언하려고 할 때 도움이 될 것입니다.
변수를 확인하려면 undefined
또는 null
해서는 안 됩니다. 그런 다음 아래 확인을 수행하십시오.
변수가 선언될 때 값을 확인하려는 경우에도 Simple: 이며 undefined
검사와 null
검사를 함께 수행합니다.
var values = variable ? variable : '';
변수가 정의되었는지 또는 의미 있는 값을 갖기를 원하는지에 따라 다릅니다.
유형이 정의되지 않았는지 확인하면 변수가 아직 정의되었는지 확인합니다.
=== null
또는 !== null
은 변수 값이 정확히 null
인지만 확인합니다.
== null
또는 != null
은 값이 undefined
또는 null
인지 확인합니다.
if(value)
는 변수가 undefined
, null
, 0
또는 빈 문자열인지 확인합니다.
변수가 전혀 정의되지 않은 경우(예: 전역 변수를 정의하는 외부 라이브러리가 아직 로드되지 않음 - 예: Google 지도) 다음과 같이 try-catch 블록을 사용하여 중단 코드 실행 없이 확인할 수 있습니다( use strict
모드)
try{ notDefinedVariable; } catch(e) { console.log('detected: variable not exists'); } console.log('but the code is still executed'); notDefinedVariable; // without try-catch wrapper code stops here console.log('code execution stops. You will NOT see this message on console');
보너스: (다른 답변 참조) ===
==
( 출처 )보다 더 명확한 이유
가장 높은 대답은 정확합니다. typeof를 사용하십시오.
그러나 내가 지적하고 싶은 것은 JavaScript에서 undefined
가 변경 가능하다는 것입니다(어떤 불경건한 이유로). varName !== undefined
대한 검사를 수행하면 다른 라이브러리가 undefined로 변경되었을 수 있기 때문에 항상 예상대로 반환되지 않을 가능성이 있습니다. 몇 가지 답변(@skalee의 경우)은 typeof
사용하지 않는 것을 선호하는 것으로 보이며 문제가 발생할 수 있습니다.
이 문제를 처리하는 "오래된"방법의 잠재적 음소거 / 오버 라이딩 상쇄하기 위해 var에 정의되지 않은 선언 된 undefined
. 그러나 가장 좋은 방법은 여전히 typeof
를 사용하는 것입니다. 다른 코드에서 undefined
재정의를 무시하기 때문입니다. 특히 페이지에서 실행될 수 있는 다른 것을 누가 알 수 있는 야생에서 사용할 코드를 작성하는 경우...
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) }
가장 강력한 '정의됨' 확인은 typeof를 사용하는 것입니다.
if (typeof elem === 'undefined')
기본값을 할당하기 위해 정의된 변수를 확인하는 경우 하나의 라이너를 쉽게 읽을 수 있도록 종종 다음을 수행할 수 있습니다.
elem = elem || defaultElem;
종종 사용하는 것이 좋습니다. 참조: 자바스크립트에서 기본값을 설정하는 관용적 방법
typeof 키워드를 사용하는 다음과 같은 라이너도 있습니다.
elem = (typeof elem === 'undefined') ? defaultElem : elem;
Null은 JavaScript의 값이고 typeof null
은 "object"
따라서 null 값을 전달하면 수락된 답변이 작동하지 않습니다. null 값을 전달하는 경우 null 값에 대한 추가 검사를 추가해야 합니다.
if ((typeof variable !== "undefined") && (variable !== null)) { // the variable is defined and not null }
undefined와 null을 구별하기 어렵습니다. Null 은 변수에 특정 값이 없음을 나타내려는 경우 변수에 할당할 수 있는 값입니다. Undefined 는 할당되지 않은 변수의 기본값이 되는 특수 값입니다.
var _undefined; var _null = null; alert(_undefined); alert(_null); alert(_undefined == _null); alert(_undefined === _null);
var _undefined; var _null = null; alert(_undefined); alert(_null); alert(_undefined == _null); alert(_undefined === _null);
typeof
연산자를 사용할 수 있습니다.
예를 들어,
var dataSet; alert("Variable dataSet is : " + typeof dataSet);
위의 코드 조각은 다음과 같은 출력을 반환합니다.
변수 dataSet은: 정의되지 않았습니다.
변수가 선언/설정되었는지 확인하기 위해 이 더러운 트릭을 수행했습니다.
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"); }
나는 개체에 따라 두 가지 다른 방법을 사용합니다.
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로 변경됩니다.
질문에 설명된 특정 상황에서,
typeof window.console === "undefined"
와 동일하다
window.console === undefined
더 짧기 때문에 후자를 선호합니다.
우리는 전역 범위(모든 브라우저 window
console
을 찾습니다. 이 특정 상황에서는 바람직합니다. console
다른 곳에서 정의되는 것을 원하지 않습니다.
그의 훌륭한 답변에서 @BrianKelley는 기술적 세부 사항을 설명합니다. 부족한 결론만 추가하고 읽기 쉬운 것으로 요약했습니다.
내 기본 설정은 typeof(elem) != 'undefined' && elem != null
입니다.
어떤 것을 선택하든 다음과 같은 기능에 수표를 넣는 것을 고려하십시오.
function existy (x) { return typeof (x) != 'undefined' && x != null; }
변수가 선언되었는지 모른다면 typeof (x) != 'undefined' && x != null;
변수가 선언되었지만 존재하지 않을 수 있는 경우 다음을 사용할 수 있습니다.
existy(elem) && doSomething(elem);
확인 중인 변수가 때때로 중첩 속성일 수 있습니다. 소품을 사용할 수 있습니다 || {}를 사용하여 해당 속성의 존재 여부를 확인하는 줄로 이동합니다.
var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;
각 속성 후에 (...' || {}').nextProp을 사용하여 누락된 속성이 오류를 발생시키지 않도록 합니다.
existy(o) && existy(op) && existy(opq) && doSomething(opq)
과 같은 Existing을 사용할 수 있습니다.
if (variable === undefined) {}
잘 작동하고 정의되지 않은 경우에만 확인합니다.
상황에 따라 다릅니다. 코드 외부에서 전역적으로 정의되거나 정의되지 않은 항목을 확인하는 경우(예: jQuery와 같이) 다음을 원합니다.
if (typeof(jQuery) != "undefined")
(엄격한 동등성은 필요하지 않습니다. typeof는 항상 문자열을 반환합니다.) 그러나 전달되었거나 전달되지 않았을 수 있는 함수에 대한 인수가 있는 경우 항상 정의되지만 생략하면 null입니다.
function sayHello(name) { if (name) return "Hello, " + name; else return "Hello unknown person"; } sayHello(); // => "Hello unknown person"
다음과 같이 try...catch 블록을 사용할 수 있습니다.
var status = 'Variable exists' try { myVar } catch (ReferenceError) { status = 'Variable does not exist' } console.log(status)
단점은 ReferenceError가 발생하므로 함수에 넣을 수 없다는 것입니다.
function variableExists(x) { var status = true try { x } catch (ReferenceError) { status = false } return status } console.log(variableExists(x))
편집하다:
프론트 엔드 Javascript에서 작업하고 변수가 초기화되지 않았는지 확인해야 하는 경우( var x = undefined
는 초기화되지 않은 것으로 간주됨) 다음을 사용할 수 있습니다.
function globalVariableExists(variable) { if (window[variable] != undefined) { return true } return false } var x = undefined console.log(globalVariableExists("x")) console.log(globalVariableExists("y")) var z = 123 console.log(globalVariableExists("z"))
편집 2:
변수가 현재 범위에 존재하는지 확인해야 하는 경우 문자열에 포함된 변수의 이름과 함께 this
function variableExists(variable, thisObj) { if (thisObj[variable] !== undefined) { return true } return false } class someClass { constructor(name) { this.x = 99 this.y = 99 this.z = 99 this.v = 99 console.log(variableExists(name, this)) } } new someClass('x') new someClass('y') new someClass('z') new someClass('v') new someClass('doesNotExist')
정확성과 간결함 때문에 이 방법을 선호합니다.
var x if (x === void 0) { console.log(`x is undefined`) } else { console.log(`x is defined`) }
다른 의견과 답변에서 언급했듯이 undefined
는 undefined라고 보장되지 않습니다. 키워드가 아니므로 전역 범위 이외의 범위에서 변수로 재정의할 수 있습니다. 다음은 이러한 뉘앙스를 보여주는 작은 예입니다.
var undefined = 'bar' console.log(`In the global scope: ${undefined}`) function foo() { var undefined = 'defined' var x if (x === undefined) { console.log(`x === undefined`) } else { console.log(`x !== undefined`) } if (x === void 0) { console.log(`x === void 0`) } else { console.log(`x !== void 0`) } } foo()
호환성에 대해서는 void 를 참조하십시오(IE5에서 지원됨!??!! 와우!).
이러한 답변(Fred Gandt 솔루션 제외)은 모두 부정확하거나 불완전합니다.
variableName;
필요하다고 가정합니다. undefined
값을 전달 var variableName;
과 같은 방식으로 선언되었습니다. 이는 이미 초기화 되었음을 의미합니다. - 이미 선언되었는지 어떻게 확인합니까?
또는 더 나은 방법 - "Book1.chapter22.paragraph37"이 단일 호출로 존재하지만 참조 오류가 발생하지 않는지 즉시 확인하는 방법은 무엇입니까?
가장 강력한 JasvaScript 연산자인 in 연산자를 사용하여 수행합니다.:
"[variable||property]" in [context||root] >> true||false
이게 아직 언급이 안된게 신기하네요...
다음은 이것을 사용하는 몇 가지 추가 변형입니다 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!
ReactJS 에서는 상황이 조금 더 복잡합니다!react-scripts@2.0.3
(2018년 10월 1일 릴리스) 이후 ESLint의 no-undef
규칙을 따르는 컴파일된 환경이기 때문입니다. 여기에 있는 문서는 이 문제에 관심이 있는 모든 사람에게 도움이 됩니다...
JavaScript에서 ES6 이전에는 변수 및 함수 선언이 범위의 맨 위로 호이스트되므로 코드에서 형식 선언 전에 식별자를 사용할 수 있습니다....
ES6의 이 [새로운] 규칙은 아직 선언되지 않은 식별자에 대한 참조를 만나면 경고합니다.
따라서 undefined
(또는 "초기화되지 않은") 변수 를 가질 수 는 있지만 eslint 규칙을 해제하지 않고는 ReactJS에서 선언되지 않은 변수를 가질 수 없습니다.
이것은 매우 실망스러울 수 있습니다. GitHub에는 ES6 이전 표준을 활용하는 프로젝트가 너무 많습니다. 조정 없이 직접 컴파일하는 것은 기본적으로 불가능합니다.
그러나 ReactJS의 eval()
사용할 수 있습니다. 다음과 같이 선언되지 않은 변수가 있는 경우...
if(undeclaredvar) {...}
이 부분을 다음과 같이 다시 작성할 수 있습니다.
if(eval('typeof undeclaredvar !== "undefined"')) {...}
예를 들어...
if(eval("false")) { console.log("NO!"); } if(eval("true")) { console.log("YEAH!"); }
GitHub 리포지토리를 ReactJS 프로젝트로 가져오는 경우 이것은 변수가 선언되었는지 확인하는 유일한 방법입니다. 닫기 전에 잘못 사용하면 eval()
보안 문제 가 있음을 상기시키고 싶습니다.
당신은 또한 사용할 수 있습니다 !!
변수 앞에 정의되어 있는지 확인합니다. 예
let dog = "woof"; let chineseCat; // Undefined. console.log("1."); console.log(!!dog && !!chineseCat ? "Both are defined" : "Both are NOT defined"); chineseCat= "mao"; // dog and chineseCat are now defined. console.log("2."); console.log(!!dog && !!chineseCat ? "Both are defined" : "Both are NOT defined");
산출:
1. Both are NOT defined 2. Both are defined
출처 : http:www.stackoverflow.com/questions/5113374/javascript-check-if-variable-exists-is-defined-initialized
언제 '$this'보다 'self'를 사용해야 합니까? (0) | 2021.12.08 |
---|---|
소수점 이하 두 자리로 부동 소수점 제한 (0) | 2021.12.08 |
NPM vs. Bower vs. Browserify vs. Gulp vs. Grunt vs. Webpack (0) | 2021.12.08 |
폴더 및 하위 폴더/파일에 대한 권한을 한 번에 변경하는 방법 (0) | 2021.12.08 |
jQuery로 현재 URL을 얻으시겠습니까? (0) | 2021.12.08 |