다음 코드를 보았습니다.
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
JavaScript를 처음 접했지만 여기에서 읽은 다른 질문에서이 코드가 의미가 없다는 인상을 받았습니다.
특히이 답변 은
이외의 컨텍스트에서 정의되지 않은 변수에 액세스하면 오류가 발생합니다typeof
.
업데이트 : 위 의 (따옴표) 답변이 잘못되었을 수 있습니다. «undefined variable» 대신 «declared variable» 이어야합니다 .
내가 알았 듯이 Ryan ♦ , maerics 및 nwellnhof 의 답변 에서 함수에 인수가 제공되지 않은 경우에도 인수에 대한 변수는 항상 선언됩니다. 이 사실은 또한 아래 목록의 첫 번째 항목이 잘못되었음을 증명합니다.
내가 이해 한 바에 따르면 다음과 같은 시나리오가 발생할 수 있습니다.
-
이 함수는 인수없이 호출되었으므로data
정의되지 않은 변수 를 만들고 에 오류가 발생했습니다data != null
. -
이 함수는 인수로
null
(또는undefined
)으로 특별히 호출 되었습니다.이 경우data != null
이미 내부 코드를 보호하여&& data !== undefined
쓸모가 없습니다. -
함수는 그 소소 모두 통과 할 경우에 비 – 널 인수로 불렸다
data != null
및data !== undefined
.
Q : 이해가 정확합니까?
Firefox 콘솔에서 다음을 시도했습니다.
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
나는 data !== undefined
후 data != null
가 쓸모없는 경우를 알아낼 수 없다 .
답변
“정의되지 않은 변수”는 값과 다릅니다 undefined
.
정의되지 않은 변수 :
var a;
alert(b); // ReferenceError: b is not defined
값을 가진 변수 undefined
:
var a;
alert(a); // Alerts “undefined”
함수가 인수를 취할 때, 그 인수는 그 값이 undefined
인 경우에도 항상 선언 되므로 오류가 없습니다. 당신 오른쪽에 대한되는 != null
다음 !== undefined
불구하고, 쓸모있는.
답변
JavaScript에서는 null
“값 없음”을 알리는 데 도움이되는 특수한 단일 객체입니다. 비교하여 테스트 할 수 있으며 JavaScript에서 평소와 같이 ===
유형 강제 변환을 혼동하지 않도록 연산자를 사용하는 것이 좋습니다 .
var a = null;
alert(a === null); // true
@rynah가 언급했듯이 “정의되지 않은”은 JavaScript에서 약간 혼동됩니다. 그러나 typeof(x)
“x”가 선언 된 변수가 아닌 경우에도 문자열이 “정의되지 않음” 인지 테스트하는 것이 안전 합니다.
alert(typeof(x) === 'undefined'); // true
또한 변수가 초기화되지 않은 경우 “정의되지 않은 값”을 가질 수 있습니다.
var y;
alert(typeof(y) === 'undefined'); // true
모두 합치면 수표는 다음과 같아야합니다.
if ((typeof(data) !== 'undefined') && (data !== null)) {
// ...
그러나 변수 “data”는 공식 함수 매개 변수이므로 항상 정의되므로 “typeof”연산자를 사용할 필요가 없으며 “정의되지 않은 값”과 직접 안전하게 비교할 수 있습니다.
function(data) {
if ((data !== undefined) && (data !== null)) {
// ...
이 스 니펫은 “함수가 정의되어 있고 널이 아닌 인수로 함수가 호출 된 경우”라고 말합니다.
답변
귀하의 경우에 사용하십시오 data==null
(null 및 undefined에 대해서만 참-행 / 열에 대한 두 번째 그림 초점은 null 정의되지 않음)
여기에 모든 것이 있습니다 ( src ) :
만약
== (그것의 부정 ! = )
=== (그것의 부정 ! == )
답변
Q : 인수없이 함수가 호출되어 데이터를 정의되지 않은 변수로 만들고 데이터에 오류가 발생했습니다! = null.
A : 예, data
정의되지 않았습니다. 스펙의 10.5 선언 바인딩 인스턴스화 섹션을 참조하십시오 . 그러나 정의되지 않은 값에 액세스해도 오류가 발생하지 않습니다. 엄격 모드에서 선언되지 않은 변수에 액세스하여 오류가 발생하는 것을 혼동하는 것 같습니다.
Q : 이 함수는 인수로 널 (또는 정의되지 않음)로 특별히 호출되었습니다.이 경우 data! = null은 이미 내부 코드를 보호하여 && data! == undefined undefined입니다.
Q : 이 함수는 널이 아닌 인수로 호출되었으며,이 경우 데이터! = null 및 data! == undefined를 모두 전달합니다.
A : 맞습니다. 다음 테스트는 동일합니다.
data != null
data != undefined
data !== null && data !== undefined
참조 섹션 11.9.3 추상 평등 비교 알고리즘 및 섹션 11.9.6 엄격한 평등 비교 알고리즘 사양의합니다.
답변
생각하지 않는 값에 대한 변수를 테스트하는 것은 일반적으로 좋은 생각이 아닙니다. 테스트는 금지 된 값의 블랙리스트를 작성하는 것으로 간주 할 수 있습니다. 그러나 모든 금지 된 값을 나열하는 것을 잊어 버린 경우 어떻게해야합니까? 누군가조차도 예기치 않은 값을 전달하여 코드를 해독 할 수 있습니다. 따라서 더 적절한 접근 방식은 화이트리스트와 같은 것입니다. 예상치 않은 값만 예상하고 변수를 테스트하는 것입니다. 예를 들어, 데이터 값이 문자열이 아닌 것으로 예상되는 경우 :
function (data) {
if (data != null && data !== undefined) {
// some code here
// but what if data === false?
// or data === '' - empty string?
}
}
다음과 같이하십시오 :
function (data) {
if (typeof data === 'string' && data.length) {
// consume string here, it is here for sure
// cleaner, it is obvious what type you expect
// safer, less error prone due to implicit coercion
}
}
답변
typeof foo === "undefined"
와는 다르므로 foo === undefined
혼동하지 마십시오. typeof foo === "undefined"
당신이 정말로 필요한 것입니다. 또한, !==
대신에 사용하십시오!=
그래서 진술은 다음과 같이 쓸 수 있습니다
function (data) {
if (typeof data !== "undefined" && data !== null) {
// some code here
}
}
편집하다:
foo === undefined
선언되지 않은 변수 에는 사용할 수 없습니다 .
var t1;
if(typeof t1 === "undefined")
{
alert("cp1");
}
if(t1 === undefined)
{
alert("cp2");
}
if(typeof t2 === "undefined")
{
alert("cp3");
}
if(t2 === undefined) // fails as t2 is never declared
{
alert("cp4");
}
답변
테스트를 수행하는 간단한 방법은 다음과 같습니다.
function (data) {
if (data) { // check if null, undefined, empty ...
// some code here
}
}
