답변:
Javascript undefined & null에 대해 약간 혼란 스럽습니다.
에 대해 혼동하지 마십시오 null
. 이는 일반적으로 대역 외 '널', '없음'또는 '없음'개체에 대한 다른 스크립팅 언어의 개념과 유사하게 작동합니다.
undefined
반면에, 이상한 자바 스크립트 문제입니다. 이것은 대역 외 값을 나타내는 단일 객체이며, 본질적으로 유사하지만 다른 두 번째 null
입니다. 다음과 같이 나타납니다.
function
명령문 목록 의 인수 목록보다 인수가 적은 함수를 호출하면 전달되지 않은 인수가로 설정됩니다 undefined
. 예를 들어 다음과 같이 테스트 할 수 있습니다.
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
이 방법을 사용하면 사이의 차이 말할 수 없습니다 dosomething(1)
와 dosomething(1, undefined)
; arg2
둘 다에서 동일한 값이됩니다. 차이점을 말해야하는 경우을 볼 수 arguments.length
있지만 이와 같은 선택적 인수를 수행하는 것은 일반적으로 읽기 쉽지 않습니다.
함수가 없으면 함수가 return value;
반환합니다 undefined
. 일반적으로 이러한 반환 결과를 사용할 필요가 없습니다.
var a
블록에 명령문을 사용 하여 변수를 선언 했지만 아직 값을 지정하지 않은 경우 변수는 undefined
입니다. 다시 말하지만, 실제로 그것에 의존 할 필요는 없습니다.
짜증 typeof
연산자는 'undefined'
피연산자가 존재하지 않는 단순한 변수 인 경우 참조하려고 할 때 일반적으로 발생하는 오류를 발생시키는 대신 반환합니다. (또한 간단한 변수를 괄호 로 묶을 수 있지만 존재하지 않는 변수를 포함하는 전체 표현식 은 제공 할 수 없습니다 .) 그다지 많이 사용하지는 않습니다.
이것은 논쟁의 여지가 있습니다. 존재하지 않는 객체의 속성에 액세스하면 다른 모든 언어와 같이 즉시 오류가 발생하지 않습니다. 대신 undefined
객체 를 얻습니다 . (그리고 undefined
나중에 스크립트에서 해당 객체 를 사용하려고 하면 JavaScript가 오류를 바로 던진 경우보다 추적하기가 훨씬 더 이상한 방식으로 잘못 진행됩니다.)
이것은 종종 속성의 존재를 확인하는 데 사용됩니다.
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
그러나 undefined
다른 값과 같이 지정할 수 있기 때문에 :
o.prop= undefined;
실제로 속성이 있는지 여부를 감지하지 못합니다. in
JavaScript의 원래 Netscape 버전이 아니었지만 현재 어디에서나 사용할 수 있는 연산자 를 사용하는 것이 좋습니다 .
if ('prop' in o)
...
요약하면 undefined
모든 사람을 혼란스럽게하는 JavaScript 관련 혼란입니다. JS가 더 우아한 메커니즘을 가지고 있지 않은 선택적 함수 인수 외에도 undefined
피해야합니다. 언어의 일부가되어서는 안됩니다. null
(2)와 (3)에서 잘 작동했을 것입니다. (4)는 JavaScript에 예외가 없었기 때문에 존재하는 오해입니다.
if (!testvar)
실제로 무엇을 합니까? undefined 및 null 또는 undefined를 테스트합니까?
이러한 'truthiness'에 대한 시험 검사 false
, undefined
, null
, 0
, NaN
및 빈 문자열. 그러나이 경우에는 그렇습니다 undefined
. IMO, 그것에 대해 더 명시 적으로 말해야 if (testvar!==undefined)
합니다.
변수가 정의되면 정의되지 않은 변수로 되돌릴 수 있습니다 (따라서 변수를 삭제하십시오).
확실히 할당 undefined
할 수는 있지만 변수는 삭제되지 않습니다. delete object.property
운영자 만 물건을 제거합니다.
delete
실제로 변수가 아닌 속성을 의미합니다. 브라우저를 사용하면 straight로 벗어날 수 delete variable
있지만 좋은 아이디어는 아니며 ECMAScript Fifth Edition의 엄격 모드에서는 작동하지 않습니다. 가비지 수집 될 수 있도록 무언가에 대한 참조를 비우려면 더 일반적 variable= null
입니다.
undefined를 매개 변수로 전달할 수 있습니까?
예.
undefined
는 단일 객체입니까? 무슨 소리 야? 이것은 객체가 아닌 기본 값입니다.
typeof foo=='undefined'
; (4a) 전역 스니핑에 사용되는 경향이 있습니다.이 경우 명시적이고 말하기를 선호 'foo' in window
하거나 (4b) undefined
값 자체 에 대해 테스트합니다 .이 경우 읽기 쉽고 말하기를 선호합니다 foo===undefined
. 이론적으로 테스트 typeof
는 'undefined'
다른 구조가 제공하지 못하는 유스 케이스를 가질 수 있습니다 : 지역 변수의 존재에 대한 스니핑. 그러나 실제로는 어떤 변수가 로컬로 선언되는지 거의 항상 알고 있습니다.
return
명령문 이없는 함수 인 # 2의주의 사항은을 반환 undefined
하지만 함수가 생성자 ( new
연산자를 사용하여 호출 한 경우)이면 명령문 이 없어도 새 객체 ( this
생성자 내부의 값)를 반환합니다 return
. console.log((function (){}()));
을 반환합니다 undefined
. console.log((new function (){}()));
객체를 반환합니다.
(? 안) 정의되지 않은 같은 변수가 더 이상 정의되지 것처럼 당신은 아무것도를 정의 할 수 없습니다 - 당신은 그냥 정의 뭔가를.
undefined
함수에 전달할 수 없습니다 . 빈 값을 전달하려면 null
대신 사용하십시오.
이 명령문 if(!testvar)
은 부울 true / false 값을 검사하며이 특정 값은로 testvar
평가 되는지 여부를 테스트합니다 false
. 정의에 null
와 undefined
같이 어느 쪽도 평가해서는 안 true
이나 false
,하지만 자바 스크립트들을 평가 null
로 false
, 당신은 정의되지 않은 변수를 평가하려고하면 오류가 있습니다.
제대로 테스트하려면 undefined
하거나 null
, 이들을 사용 :
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
==
및 !=
) 를 사용하지 말 것을 권고합니다 .
var a= undefined
. 통과 할 수 있습니다 fn(undefined)
. p
객체 의 정의되지 않은 속성 o
과로 p
정의되어 설정된 속성 의 차이를 찾으려면 연산자 undefined
를 사용해야합니다 'p' in o
.
testvar === undefined
좀 더 복잡한 테스트 보다는 테스트하지 않아야하는 이유가 typeof(testvar) === "undefined"
있습니까?
typeof
정의되지 않은 변수에 대한 시험 : 달리 null
, undefined
전역 객체의 속성은 단순히 그 자체를 재정의 할 수있다. 특정 코딩 스타일과 누락 된 등호 만 사용하며 undefined
자동으로 변경됩니다.if (undefined = someVar) {...}
undefined
전역 객체의 불변 속성을 만들어이 문제를 해결 하므로 예전보다 안전합니다. 그러나 undefined
함수 내에서 호출되는 가변 변수를 정의하는 것이 여전히 가능 하므로 문제가 완전히 사라지지 않았습니다.
기본적인 차이가 있다는 것입니다 undefined
및 null
다른 개념을 나타냅니다.
null
사용 가능한 경우에만 null
성가신 오류 잡기를 사용하지 않으면 의도적으로 값으로 설정되었는지 또는 값이 아직 설정되지 않았는지 확인할 수 없습니다.
var a;
a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
그러나 의도적으로 값을로 설정하면 다음 null
과의 엄격한 동등성이 undefined
실패하므로 값 null
과 undefined
값 을 구별 할 수 있습니다 .
var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;
"요약하면 undefined는 JavaScript 관련 혼란으로 모든 사람을 혼란스럽게한다"는 말을 무시하고 말을하는 사람들에게 의존하는 대신 여기에서 참조를 확인하십시오. 당신이 혼란 스럽다고해서 그것이 엉망이라는 것을 의미하지는 않습니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
이 문제가 자바 스크립트를 특정하지 않고는 부울 결과가 될 수있는 일반화 된 개념을 완료 true
, false
알 수없는 ( null
) 값 없음 ( undefined
), 또는 문제가 발생했습니다 ( error
).
null
잘 작동했을 것입니다. a == null
입니다 true
자바 스크립트 유형 강제 변환하기 때문이다.
그렇습니다 . undefined가 undefined로 정의 되어 있기 때문에 가능 합니다.
console.log(
/*global.*/undefined === window['undefined'] &&
/*global.*/undefined === (function(){})() &&
window['undefined'] === (function(){})()
) //true
너의 경우:
test("value1", undefined, "value2")
자신 만의 정의되지 않은 변수를 만들 수도 있습니다 .
Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined
첫 번째 질문에 답하기 위해 not 연산자 ( !
)는 부울 값으로 주어진 모든 것을 강제합니다. 그래서 null
, 0
, false
, NaN
과 ""
(빈 문자열)은 모든 거짓 표시됩니다.
undefined
로 표시되지 않으면 false
'정의되지 않음'오류가 발생합니다.
if (undefined) {/* Do stuff*/}
때문에 오류가 발생하지 않습니다 undefined
. 오류는 다음과 같습니다if (someUndeclaredVariable) {/* Do stuff*/}
js
Ubuntu 12.10에서 Java와 함께 제공 되는 javascript 명령 행 터미널 에서 변수를 undefined로 설정하십시오 .
el@defiant ~ $ js
js> typeof boo
"undefined"
js> boo
typein:2: ReferenceError: boo is not defined
js> boo=5
5
js> typeof boo
"number"
js> delete(boo)
true
js> typeof boo
"undefined"
js> boo
typein:7: ReferenceError: boo is not defined
이것을 myjs.html에 넣으십시오.
<html>
<body>
<script type="text/JavaScript">
document.write("aliens: " + aliens);
document.write("typeof aliens: " + (typeof aliens));
var aliens = "scramble the nimitz";
document.write("found some aliens: " + (typeof aliens));
document.write("not sayings its aliens but... " + aliens);
aliens = undefined;
document.write("aliens deleted");
document.write("typeof aliens: " + (typeof aliens));
document.write("you sure they are gone? " + aliens);
</script>
</body>
</html>
이것을 인쇄합니다 :
aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined
경고! 변수를 undefined로 설정하면 변수를 다른 변수로 설정하게됩니다. 교활한 사람이 실행되면 undefined = 'rm -rf /';
변수를 undefined로 설정할 때마다 해당 값을받습니다.
처음에 정의되지 않은 값의 외계인을 출력하고 여전히 실행할 수 있는지 궁금 할 것입니다. 자바 스크립트 게양 때문입니다 : http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
에 대한 if (something)
그리고 if (!something)
뭔가가 정의 정의되거나되지 않은 경우 일반적으로 검사하는 데 사용됩니다. 예를 들면 다음과 같습니다.
if (document.getElementById)
식별자는 부울 값으로 변환되므로 undefined
로 해석됩니다 false
. 물론으로 해석되는 다른 값 (0 및 ''과 같은)도 false
있지만 식별자는 합리적으로 그러한 값을 가져서는 안되거나 그러한 값을 정의되지 않은 것과 동일하게 취급하는 것에 만족합니다.
Javascript에는 delete
객체의 멤버를 삭제하는 데 사용할 수 있는 연산자가 있습니다. 변수의 범위에 따라 (즉 전역 변수인지 아닌지) 변수를 삭제하여 정의하지 않을 수 있습니다.
undefined
정의되지 않은 리터럴로 사용할 수있는 키워드 는 없습니다 . 함수 호출에서 매개 변수를 생략하여 정의하지 않을 수 있지만 매개 변수를 더 적은 수의 함수로 보내야만 사용할 수 있으므로 중간에 매개 변수를 생략 할 수 없습니다.
재미를 위해서 변수에 "지정되지 않은"을 할당하는 상당히 안전한 방법이 있습니다. 충돌이 발생하려면 무작위로 생성 된 문자열과 정확히 동일한 이름을 가진 Object의 프로토 타입에 누군가를 추가해야합니다. 임의의 문자열 생성기가 향상 될 수 있다고 확신하지만 JavaScript에서 무작위 문자열 / 문자 생성
이것은 새로운 객체를 생성하고 무작위로 생성 된 이름으로 속성에 액세스하려고 시도합니다.이 이름은 존재하지 않으므로 정의되지 않은 값을 갖습니다.
function GenerateRandomString() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 50; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var myVar = {}[GenerateRandomString()];