[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
당신을 위해 일을 할 것입니다 …. 이것은 아래의 경우를 확인합니다 :
- undefined : 값이 정의되어 있지 않은 경우
undefined
- null : null 인 경우, 예를 들어 DOM 요소가 존재하지 않는 경우
- 빈 문자열 :
''
- 0 : 숫자 0
- NaN : 숫자가 아님
- 그릇된
따라서 모든 경우를 다루지 만 항상 공백이있는 문자열과 같이 항상 이상한 경우가 있습니다.이 문자열과 같이 공백이있는 문자열은 문자열 ' '
안에 공백이 있으므로 자바 스크립트로 정의됩니다 … 예를 들어이 경우에는 다음과 같이 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()
방법은
객체가 지정된 속성을 자체 속성으로 가지고 있는지 여부를 나타내는 부울을 반환합니다 (상속하는 것이 아니라).
여부를 결정하는 데 사용할 수 있습니다
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
기능에 알려진 test
int로서 undefined
값.