JavaScript에서 null과 undefined의 차이점은 무엇입니까?


1086

나는 차이가 사이에 무엇인지 알고 싶어 null하고 undefined자바 스크립트로.




11
나는 항상 생각했다 : null당신이 그것을 비우기로 설정 했 습니까? 설정 undefined되지 않았기 때문에 비어 있습니다. 또는 null비어 있지만 의도적으로 undefined비어 있습니다. 기본적으로 의도를 보여줍니다.
Muhammad Umer


15
NaN. 직접 참조하십시오. console.log (널 정의되지 않음). null과 undefined의 차이는 NaN입니다. (이 질문을 오해 한 것에 대해 나를 화나게하기 전에 이것은 유머를 시도한 것입니다.)
Ivan

답변:


1040

JavaScript에서 undefined변수가 선언되었지만 다음과 같은 값이 아직 지정되지 않았 음을 의미합니다.

var TestVar;
alert(TestVar); //shows undefined
alert(typeof TestVar); //shows undefined

null할당 값입니다. 값이없는 표현으로 변수에 할당 할 수 있습니다.

var TestVar = null;
alert(TestVar); //shows null
alert(typeof TestVar); //shows object

앞의 예에서, 분명하다 undefined그리고 null두 가지 유형은 다음과 같습니다 undefined동안 유형 (정의되지 않은) 자체가 null개체입니다.

null === undefined // false
null == undefined // true
null === null // true

null = 'value' // ReferenceError
undefined = 'value' // 'value'

301
Professional JS For Web Developers (Wrox) 책에서 인용 한 내용 : "유형 연산자가 null 값에 대해 'object'를 반환하는 이유가 궁금 할 수 있습니다. 이는 실제로 원래 JavaScript 구현에서 ECMAScript로 복사 된 오류였습니다. 기술적으로는 기본 값인 경우에도 null이 객체의 자리 표시 자로 간주된다는 것이 합리적입니다. "
Captain Sensible

34
변수가 전혀 정의되지 않았을 수도 있습니다. 예를 들면 다음과 같습니다. console.log (typeof (abc)); undefined
Nir O.

19
Nir O.의 의견은 매우 중요합니다. 처음에 값이없는 변수를 원하면 "... = null"(예 : "myvar = null")을 작성합니다. 이렇게하면- "if (myxar == null) {...}"을 잘못 입력하면 if 블록이 실행되지 않습니다. undefined와 함께이 이점이 없습니다 : myvar = undefined; 마이 바 = 4; if (typeof myxar == "undefined") {...}
Wolfgang Adamec

11
@Wolfgang Adamec, 오류없는 프로그래밍은 잘못된 유형에 관한 것이 아닙니다.
Jorge Fuentes González

12
따라서 기본적으로 null 값은 변수가 명시 적으로 (값 = null)로 설정되었거나 초기화되어 아무것도 아닌 것으로 정의되었음을 의미합니다. 정의되지 않은 의미합니다. 초기화되지 않았거나 정의되지 않은 것 같습니다.
무하마드 우 메르

74

나는 여기 에서 이것을 골랐다

정의되지 않은 값은 변수에 값이 지정되지 않은 경우 사용되는 기본 값입니다.

널값은 널, 비어 있거나 존재하지 않는 참조를 나타내는 기본 값입니다.

var를 통해 변수를 선언하고 값을 지정하지 않으면 값이 정의되지 않습니다. 자체적으로이 값을 WScript.Echo () 또는 alert ()하려고하면 아무 것도 표시되지 않습니다. 그러나 빈 문자열을 추가하면 갑자기 나타납니다.

var s;
WScript.Echo(s);
WScript.Echo("" + s);

변수를 선언하고 null로 설정하면 "null"이 출력되고 "undefined"가 표시되는 것을 제외하고는 동작이 동일합니다. 이것은 실제로 작은 차이입니다.

정의되지 않은 변수를 null로 또는 그 반대로 비교할 수도 있으며 조건은 true입니다.

undefined == null
null == undefined

그러나 두 가지 유형으로 간주됩니다. undefined는 그 자체로 유형이지만 null은 특수한 객체 값으로 간주됩니다. 변수의 일반적인 유형을 나타내는 문자열을 반환하는 typeof ()를 사용하여이를 확인할 수 있습니다.

var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));

위 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

undefined
object

유형이 다르더라도 둘 중 하나의 멤버에 액세스하려고하면 (예 : 예외가 발생 함) 여전히 동일하게 작동합니다. WSH를 사용하면 " 'varname'은 null이거나 객체가 아닙니다"라는 메시지가 표시되며 운이 좋으면 다른 기사의 주제입니다.

명시 적으로 변수를 정의되지 않도록 설정할 수는 있지만 강력히 권장합니다. 변수를 null로 설정하고 설정하지 않은 것의 값을 정의하지 않은 상태로 두는 것이 좋습니다. 동시에 모든 변수를 항상 설정하는 것이 좋습니다. JavaScript는 C 스타일 언어와는 다른 스코프 체인을 가지고있어 심지어 베테랑 프로그래머조차도 쉽게 혼동 할 수 있으며 변수를 null로 설정하는 것이 버그를 방지하는 가장 좋은 방법입니다.

정의되지 않은 팝업이 나타나는 또 다른 인스턴스는 delete 연산자를 사용할 때입니다. C 세계의 사람들은 이것을 객체를 파괴하는 것으로 잘못 해석 할 수도 있지만 그렇지 않습니다. 이 작업은 배열에서 첨자를 제거하거나 개체에서 구성원을 제거합니다. 배열의 경우 길이에 영향을 미치지 않지만 이제 아래 첨자는 정의되지 않은 것으로 간주됩니다.

var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]);

위 스크립트의 결과는 다음과 같습니다.

0.) a
1.) undefined
2.) c

존재하지 않는 첨자 또는 멤버를 읽을 때 정의되지 않은 리턴이 표시됩니다.

null과 undefined의 차이점은 다음과 같습니다. JavaScript는 아무것도 null로 설정하지 않습니다. 일반적으로 우리가하는 일입니다. 우리는 변수를 undefined로 설정할 수 있지만, 우리에게 행해진 것이 아니기 때문에 null을 선호합니다. 디버깅 할 때 null로 설정된 것은 JavaScript가 아닌 자신이하는 일임을 의미합니다. 그 외에도이 두 가지 특수한 값은 거의 같습니다.


8
정말 좋은 대답입니다. 그러나 u가 "undefined == null"을 체크했을 때 타입 검사는 엄격하지 않았다. 따라서 "true"를 반환했습니다. "undefined === null"을 확인하면 false가 반환됩니다.
06 초에

3
이 기능은 '11 년에 선택적인 기능 매개 변수의 출현, 흐름과 같은 유형 검사 시스템의 출현, React의 보급 성 (모두 정의되지 않은 것과 널 (null)을 매우 다르게 취급 함)과 함께 일반적으로 undefined 대신 null을 사용하면 더 이상 엄격하게 유지되지 않습니다. 기본값을 명시 적으로 사용하려는 경우 (예 : 선택적 param 또는 선택적 React prop)의 경우 undefined가 null보다 선호됩니다.
0x24a537r9 2:15에

64

이것이 차이점입니다

(문자 부족으로 인해 문자를 추가하므로 게시 할 수 있습니다.)


1
이미지 소스의 속성을 포함시킬 수 있습니까?
Vega

1
@Vega 불행히도 아니요, imgur.com의 어딘가에서 어디에서 얻었는지 기억하지 못하며 원래 출처가 아닌 다시 게시 한 것입니다. 여기에 포함 된 링크 조차도이 버전을 게시 한 사람에 대한 단서를 제공하지 않으므로 실제로 검색 할 수도 없습니다.
Sebastian Norr

1
하 하 하 ... 이것은 내가 본 최고의 설명입니다! 멋있는!
Akbar Mirsiddikov

36

없는 은 값이 없음을 나타내는 특수 키워드입니다.

다음과 같은 가치로 생각하십시오.

  • "foo"는 문자열입니다.
  • true는 부울입니다.
  • 1234는 숫자입니다
  • null은 정의되어 있지 않습니다.

undefined 속성은 변수에 null을 포함한 값이 할당되지 않았 음을 나타냅니다. 처럼

var foo;

정의 된 빈 변수는 null데이터 유형입니다undefined


둘 다 값이없는 변수값을 나타냅니다.

AND null 는 값이없는 문자열 을 나타내지 않습니다 -빈 문자열-


처럼

var a = ''; 
console.log(typeof a); // string 
console.log(a == null); //false 
console.log(a == undefined); // false 

이제

var a;
console.log(a == null); //true
console.log(a == undefined); //true 

그러나

var a; 
console.log(a === null); //false 
console.log(a === undefined); // true

그래서 각자 사용하는 방법이 있습니다

정의되지 않은 변수 데이터 유형을 비교하는 데 사용

null 변수의 값을 비우려면 사용하십시오.

var a = 'javascript';
a = null ; // will change the type of variable "a" from string to object 

null도 데이터 형식입니다. undefined와 null은 데이터 형식과 값입니다.
danwellman

9
null절대적으로 IS 데이터 형식은 msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx입니다. 사실은 typeof null반환 object이전 버전과의 호환성을 위해 남아있다 인 ECMAScript의 초기 버전에서 잘 알려져 있고 문서화 된 버그입니다. 하는 링크 실제로 당신의 코멘트에 게시을 반 페이지 아래 "대해서 typeof 널 (null) // 객체 (ECMAScript를 버그, NULL이어야합니다)"라고! 따라서 다운 투표에 댓글을 달기 전에 검색 노력을 보여주십시오
danwellman

1
정의가 모순됨 : "값 없음"vs "값이 지정되지 않았습니다". 동일하지 않습니까?
Zon

3
이 답변에 동의하지 않습니다. Null과 Undefined는 모두 고유 한 데이터 유형입니다. null은 null 형식이고 undefined는 undefined 형식입니다. 정확한 연산자 (==)를 사용하는 경우에만 자바 스크립트가 true를 나타내지 만 엄격한 비교 (===)는 false를 생성합니다.
alaboudi

19

null : 변수 값이 없습니다. undefined : 변수 자체가 없음;

.. 여기서 variable은 값과 연관된 기호 이름입니다.

JS는 새로 선언 된 변수를 null 로 암시 적으로 초기화하기에 충분할 수 있지만 그렇지 않습니다.


25
var a = {}; a.n = undefined;' then ..a.hasOwnProperty ( 'n') == true` ... 변수 자체의 부재가 더 이상 정확하지 않다고 말하는 경우
Muhammad Umer

17

다음을주의 깊게 읽으십시오. JavaScript에서 nullundefined 의 차이점에 대한 모든 의심을 제거합니다 . 또한 아래에 제공된 유틸리티 기능을 사용하여 유형을 정확하게 결정할 수 있습니다.

JavaScript에서는 다음과 같은 유형의 변수를 가질 수 있습니다.

  1. 선언되지 않은 변수
  2. 선언되었지만 할당되지 않은 변수
  3. 리터럴이 정의되지 않은 변수
  4. 리터럴 널로 지정된 변수
  5. undefined 또는 null 이외의 변수가 할당 된 변수

다음은 이러한 각 사례를 하나씩 설명합니다.

  1. 선언되지 않은 변수 : 다음은 선언되지 않은 변수에 적용됩니다.

    • 문자열 'undefined' 를 반환 하는 typeof () 로만 확인할 수 있습니다.
    • 확인할 수 없습니다 == 또는 === 나에 의해 경우 또는 조건 연산자 ? (참조 오류 발생)
  2. 선언되었지만 할당되지 않은 변수

    • typeof 는 문자열 'undefined'를 반환합니다
    • == null 로 검사하면 true가 반환됩니다.
    • == 정의되지 않은 상태 로 검사하면 true가 반환됩니다.
    • === null 로 검사하면 false가 반환됩니다.
    • === 정의되지 않은 상태 로 검사하면 true가 반환됩니다.
    • 경우 또는 조건부 연산자 ? 거짓을 돌려 준다
  3. 리터럴 undefined로 지정된 변수 : 이러한 변수는 선언 되었지만 할당되지 않은 변수 와 유사하게 취급됩니다 .

  4. 리터럴 널로 지정된 변수

    • typeof 는 문자열 'object'를 반환합니다
    • == null 로 검사하면 true가 반환됩니다.
    • == 정의되지 않은 상태 로 검사하면 true가 반환됩니다.
    • === null 로 검사하면 true가 반환됩니다.
    • === 정의되지 않은 상태 로 검사하면 false가 반환됩니다.
    • 경우 또는 조건부 연산자 ? 거짓을 돌려 준다
  5. undefined 또는 null 이외의 변수가 할당 된 변수

    • typeof는 'string' , 'number' , 'boolean' , 'function' , 'object' , 'symbol' 문자열 중 하나를 리턴합니다.

다음은 변수의 올바른 유형 검사 알고리즘을 제공합니다.

  1. 확인 선언되지 않은 / 할당 / 할당 정의되지 않은 사용 대해서 typeof . 문자열 'undefined' 가 반환 되면 반환
  2. ===를 사용하여 null 을 확인하십시오 . 반환 '널 (null)' 의 경우 사실 .
  3. typeof를 사용하여 실제 유형을 확인하십시오 . 'object'와 같지 않은 경우 반환 유형
  4. 실제 객체 유형을 확인하려면 Object.prototype.toString.call (o) 를 호출하십시오 . 내장 된 모든 자바 스크립트 또는 DOM 정의 객체 에 대해 '[object ObjectType]' 유형의 문자열을 반환해야 합니다 . 사용자 정의 객체의 경우 '[object Object]'를 반환합니다.

유형을 결정하기 위해 다음 유틸리티 기능을 사용할 수도 있습니다. 현재 모든 ECMA 262 2017 유형을 지원합니다.

function TypeOf(o,bReturnConstructor)
 {
   if(typeof o==='undefined') return 'undefined'
   if(o===null) return 'null'   
   if(typeof o!=='object') return typeof o

   var type=Object.prototype.toString.call(o)
  switch(type)
  {
     //Value types:4
     case '[object Number]': type='number';break;
     case '[object String]': type='string';break;
     case '[object Boolean]': type='boolean';break;
     case '[object Date]': type='date';break;


   //Error Types:7
     case '[object Error]': type='error';break;
     case '[object EvalError]': type='evalerror';break;
     case '[object RangeError]': type='rangeerror';break;
     case '[object ReferenceError]': type='referenceerror';break;
     case '[object SyntaxError]': type='syntaxerror';break;
     case '[object TypeError]': type='typeerror';break;
     case '[object URIError]': type='urierror';break;


    //Indexed Collection and Helper Types:13
     case '[object Array]': type='array';break;
     case '[object Int8Array]': type='int8array';break;
     case '[object Uint8Array]': type='uint8array';break;
     case '[object Uint8ClampedArray]': type='uint8clampedarray';break;
     case '[object Int16Array]': type='int16array';break;
     case '[object Uint16Array]': type='uint16array';break;
     case '[object Int32Array]': type='int32array';break;
     case '[object Uint32Array]': type='uint32array';break;
     case '[object Float32Array]': type='float32array';break;
     case '[object Float64Array]': type='float64array';break;
     case '[object ArrayBuffer]': type='arraybuffer';break;
     case '[object SharedArrayBuffer]': type='sharedarraybuffer';break;
     case '[object DataView]': type='dataview';break;

    //Keyed Collection Types:2
     case '[object Map]': type='map';break;
     case '[object WeakMap]': type='weakmap';break;

    //Set Types:2
     case '[object Set]': type='set';break;
     case '[object WeakSet]': type='weakset';break;

    //Operation Types
    case '[object RegExp]': type='regexp';break;
    case '[object Proxy]': type='proxy';break;
    case '[object Promise]': type='promise';break;

    case '[object Object]': type='object';
             if(bReturnConstructor && o.constructor) type=o.constructor.toString().match(/^function\s*([^\s(]+)/)[1];
         break;
    default:
        type=type.split(' ')[1]
        type=type.substr(0,type.length-1)   

   }
    return type 
}

12

undefined는 시스템 수준, 예상치 못한 또는 오류와 같은 값 없음을 나타내는 것으로 간주하고 프로그램 수준, 정상 또는 예상되는 값 없음을 나타내는 경우 null을 고려할 수 있습니다.

JavaScript를 통해 : 완벽한 가이드


11

나는 설명 할 것 undefined, null그리고Uncaught ReferenceError :

1- Uncaught ReferenceError: 변수 스크립트 에 선언되지 않았습니다 .이 변수에 대한 참조가 없습니다 .
2- undefined: 변수가 선언되었지만 초기화되지 않음
3- null: 변수가 선언되었으며 빈 값입니다.


9

정의되지 않음은 변수가 선언되었지만 값이 없음을 의미합니다.

var var1;
alert(var1); //undefined
alert(typeof var1); //undefined

Null은 과제입니다.

var var2= null;
alert(var2); //null
alert(typeof var2); //object

9

nullundefined 는 다음과 같은 공통된 두 가지 개체 유형입니다.

  • 둘 다 각각 단일 값인 nullundefined 만 가질 수 있습니다 .
  • 둘 다 속성이나 메서드가 없으며 속성 중 하나를 읽으려고하면 런타임 오류가 발생합니다 (다른 모든 개체의 경우 존재하지 않는 속성을 읽으려고 하면 값이 정의되지 않음 ).
  • 값은 널 (null)정의는 서로와 의해 아무것도 동일한 고려 ==!=운영자.

그러나 유사점은 여기서 끝납니다. 한 번만, 키워드 nullundefined 가 구현 되는 방식에는 근본적인 차이 가 있습니다. 이것은 분명하지 않지만 다음 예제를 고려하십시오.

var undefined = "foo";
WScript.Echo(undefined); // This will print: foo

undefined , NaNInfinity 는 사전 초기화 된 "슈퍼 글로벌"변수의 이름 일뿐입니다. 런타임시 초기화되며 동일한 이름을 가진 일반 전역 또는 로컬 변수로 대체 될 수 있습니다.

이제 null을 사용 하여 같은 것을 시도해 봅시다 .

var null = "foo"; // This will cause a compile-time error
WScript.Echo(null);

죄송합니다! null , truefalse 는 예약 된 키워드입니다. 컴파일러에서 키워드를 변수 또는 속성 이름으로 사용할 수 없습니다

또 다른 차이점은 undefined 는 기본 유형이고 null 은 객체 유형입니다 (객체 참조가 없음을 나타냄). 다음을 고려하세요:

WScript.Echo(typeof false); // Will print: boolean
WScript.Echo(typeof 0); // Will print: number
WScript.Echo(typeof ""); // Will print: string
WScript.Echo(typeof {}); // Will print: object
WScript.Echo(typeof undefined); // Will print: undefined
WScript.Echo(typeof null); // (!!!) Will print: object

또한 nullundefined 가 숫자 컨텍스트에서 처리되는 방식에 중요한 차이점이 있습니다 .

var a; // declared but uninitialized variables hold the value undefined
WScript.Echo(a === undefined); // Prints: -1

var b = null; // the value null must be explicitly assigned 
WScript.Echo(b === null); // Prints: -1

WScript.Echo(a == b); // Prints: -1 (as expected)
WScript.Echo(a >= b); // Prints: 0 (WTF!?)

WScript.Echo(a >= a); // Prints: 0 (!!!???)
WScript.Echo(isNaN(a)); // Prints: -1 (a evaluates to NaN!)
WScript.Echo(1*a); // Prints: -1.#IND (in Echo output this means NaN)

WScript.Echo(b >= b); // Prints: -1 (as expected)
WScript.Echo(isNaN(b)); // Prints: 0 (b evaluates to a valid number)
WScript.Echo(1*b); // Prints: 0 (b evaluates to 0)

WScript.Echo(a >= 0 && a <= 0); // Prints: 0 (as expected)
WScript.Echo(a == 0); // Prints: 0 (as expected)
WScript.Echo(b >= 0 && b <= 0); // Prints: -1 (as expected)
WScript.Echo(b == 0); // Prints: 0 (!!!)

산술 표현식이나 숫자 비교에 사용되는 경우 null0이 됩니다. false 와 마찬가지로 기본적으로 특수한 종류의 "0"입니다. 반면에 undefined 는 진정한 "아무것도 아니며" NaN 이됩니다 숫자 컨텍스트에서 사용하려고하면 ( "숫자가 아님")이됩니다.

참고 널 (null)을 하고 정의되지 않은 에서 특별한 치료를받을 ==!=사업자,하지만 당신은 진정한 숫자의 평등을 테스트 할 수 있습니다 와 B 표현과를 .(a >= b && a <= b)


8

tl; dr

null변수라는 것을 변수로 설정하는 데 사용하십시오 .

undefined유형이 혼합 된 변수를 설정하는 데 사용 합니다.


이것은 5 가지 기본 요소와 객체 유형을 모두 사용하며«유스 케이스»와 undefined또는 의 차이점을 설명합니다 null.

모든 수명주기 동안 변수가 문자열 일 뿐이라는 것을 알고 있다면 규칙에 따라 다음과 같이 초기화 할 수 있습니다 "".

("") ? true : false; // false
typeof ""; // "string";
("Hello World") ? true : false; // true
typeof "Hello World"; // "string"

번호

모든 수명주기 동안 변수가 숫자 일뿐 규칙에 따라 변수를 초기화 할 수 있습니다 0(또는 사용에 중요한 값이있는 NaN경우 0).

(0) ? true : false; // false
typeof 0; // "number";
(16) ? true : false; // true
typeof 16; // "number"

또는

(NaN) ? true : false; // false
typeof NaN; // "number";
(16) ? true : false; // true
typeof 16; // "number"

부울

모든 수명주기 동안 변수가 부울 일뿐이라는 것을 알고 있다면 규칙에 따라 다음과 같이 초기화 할 수 있습니다 false.

(false) ? true : false; // false
typeof false; // "boolean";
(true) ? true : false; // true
typeof true; // "boolean"

목적

모든 수명주기 동안 변수가 객체 일 뿐이라는 것을 알고 있다면 규칙에 따라 초기화 할 수 있습니다 null.

(null) ? true : false; // false
typeof null; // "object";
({}) ? true : false; // true
typeof {}; // "object"

참고 : 스마트 사용량 off null은 Object가 항상 이고 return 이기 때문에 잘못된 버전의 Object입니다 . 즉, Object 및 null 유형 모두에 대해 일관된 값을 반환합니다.truetypeof nullobjecttypeof myVarObject

모두

변수에 혼합 유형 (모든 수명주기 동안 모든 유형)이있는 경우 규칙에 따라 초기화 할 수 있습니다 undefined.


7

null"값 없음"을 의미하는 특수 값입니다. 'object'를 반환 null하기 때문에 특수한 개체 typeof null입니다.

반면에 undefined변수가 선언되지 않았거나 값이 제공되지 않았 음을 의미합니다.


2
undefined변수가 선언되지 않았지만이를 보증하지는 않을 수도 있음 에 유의 해야합니다. 변수는로 선언 var thing;될 수 있으며 같을 것 undefined입니다.
Yura

6

차이점을 이해하는 가장 좋은 방법은 먼저 JavaScript의 내부 작업에 대해 생각하고 다음과 같은 의미의 차이점을 이해하는 것입니다.

let supervisor = "None"
    // I have a supervisor named "None"

let supervisor = null
    // I do NOT have a supervisor. It is a FACT that I do not.

let supervisor = undefined
    // I may or may not have a supervisor. I either don't know
    // if I do or not, or I am choosing not to tell you. It is
    // irrelevant or none of your business.

이 이러한 삼가지 경우 사이에 의미의 차이이며, 자바 스크립트는 두 개의 서로 다른 값으로 후자의 두 사례를 구별 null하고 undefined. 이러한 의미를 전달하기 위해 해당 값을 명시 적으로 사용할 수 있습니다.

그렇다면이 철학적 근거로 인해 발생하는 JavaScript 관련 문제는 무엇입니까?

  1. 이니셜 라이저가없는 선언 된 변수 undefined는 의도 한 값이 무엇인지 말한 적이 없기 때문에 값을 가져옵니다 .

    let supervisor;
    assert(supervisor === undefined);
  2. 설정되지 않은 개체의 속성 undefined은 해당 속성에 대해 아무 말도하지 않았기 때문에 평가됩니다 .

    const dog = { name: 'Sparky', age: 2 };
    assert(dog.breed === undefined);
  3. nullundefined브렌던 아이크 그렇게 말했기 때문에 서로 "비슷한"입니다. 그러나 그들은 서로 강조되지 않습니다.

    assert(null == undefined);
    assert(null !== undefined);
  4. null그리고 undefined고맙게도 다른 유형이있다.null유형에 속하는 Nullundefined유형에 Undefined. 이것은 사양에 있지만, typeof여기에서 반복하지 않을 이상한 점 때문에 이것을 결코 알지 못할 것입니다.

  5. 명시적인 return 문없이 본문 끝에 도달하는 함수는 반환 된 내용에 undefined대해 아무것도 모르기 때문에 반환합니다.

그건 그렇고, JavaScript에는 다른 형태의 "무의미 함"이 있습니다 (철학을 연구 한 것이 좋습니다 ....)

  • NaN
  • 선언되지 않은 변수를 사용하여 ReferenceError
  • 사용하여 letconst임시 데드 존에서 또는 정의 된 지역 변수를 하여ReferenceError
  • 희소 배열의 빈 셀. 네, 정의되지 않은 undefined것과 비교해 도 마찬가지 ===입니다.

    $ node
    > const a = [1, undefined, 2]
    > const b = [1, , 2]
    > a
    [ 1, undefined, 2 ]
    > b
    [ 1, <1 empty item>, 2 ]

최고의 답변! 대부분의 답변 은 경우 와 같이 변수 값을로 정의undefined 할 수 있다는 사실을 무시합니다 let supervisor = undefined.
J. Bruni

고맙습니다. 그렇습니다. 무언가가 undefined선언되지 않았거나 아직 가치가 주어지지 않은 경우에만 오해라는 생각은 너무나 만연하며 사람들을 만나기가 매우 어렵습니다. 그래서 많은 사람들이 모두있는을 위해 자바 스크립트를 쓰레기 nullundefined그러나이 값은 않습니다 완전히 별개의 의미를 가지고 있으며 대부분의 경우 그들이 의도 한 의미 (물론 이럴)와 함께 잘 작동합니다.
레이 톨

5

JavasSript에는 String, Number, Boolean, null 및 undefined의 5 가지 기본 데이터 유형이 있습니다. 간단한 예를 들어 설명하려고합니다.

우리는 간단한 기능을 가지고 있다고

 function test(a) {

     if(a == null){
        alert("a is null");
     } else {
        alert("The value of a is " + a);
     }
  }

위의 함수에서도 if (a == null)은 if (! a)와 같습니다.

이제 매개 변수 a를 전달하지 않고이 함수를 호출하면

   test(); it will alert "a is null";
   test(4); it will alert "The value of a is " + 4;

또한

var a;
alert(typeof a); 

이것은 정의되지 않습니다; 변수를 선언했지만이 변수에 값을 할당하지 않았습니다. 하지만 우리가 쓰면

var a = null;
alert(typeof a); will give alert as object

따라서 null은 객체입니다. 'a'에 null 값을 할당하는 방식으로


기호 : 새로운 원시적 형이다
알렉산더 밀스

4

대한 undefined 유형, 오직 하나 개의 값이 : undefined.

대한 null 유형, 오직 하나 개의 값이 : null.

두 사람 모두 대해 레이블은 유형과 값입니다.

그들 사이의 차이점. 예를 들면 다음과 같습니다.

  • null 빈 값입니다
  • undefined 결 측값입니다

또는:

  • undefined 아직 가치가 없었습니다
  • null 가치가 있었고 더 이상

실제로 null 특별한 키워드입니다 는 식별자 이므로 할당 할 변수로 취급 할 수 없습니다.

그러나 undefined이다 식별자 . 그러나 non-strictmode와 strictmode 모두 undefined라는 로컬 변수를 만들 수 있습니다. 그러나 이것은 끔찍한 아이디어입니다!

function foo() {
    undefined = 2; // bad idea!
}

foo();

function foo() {
    "use strict";
    undefined = 2; // TypeError!
}

foo();

4

자바 스크립트로 변수를 선언하면 값이 할당됩니다 undefined. 이는 변수가 변경되지 않았으며 나중에 어떤 값이든 할당 할 수 있음을 의미합니다. 또한 선언 시이 변수가 보유 할 값을 모른다는 것을 의미합니다.

이제 변수를 명시 적으로 할당 할 수 있습니다 null . 변수에 값이 없음을 의미합니다. 예를 들어, 어떤 사람들은 중간 이름이 없습니다. 따라서 그러한 경우 person 객체의 middlename 변수에 null 값을 할당하는 것이 좋습니다.

이제 누군가가 사용자 오브젝트의 중간 이름 변수에 액세스하고 있으며 값이 있다고 가정하십시오 undefined. 개발자가이 변수를 초기화하지 않았는지 또는 값이 없는지 알 수 없었습니다. 값이 null인 경우 사용자는 중간 이름에 값이없고 수정되지 않은 변수가 아니라는 것을 쉽게 유추 할 수 있습니다.


3

null 및 undefined는 모두 일부 값이 없음을 나타내는 데 사용됩니다.

var a = null;

a가 초기화되고 정의됩니다.

typeof(a)
//object

null은 JavaScript의 객체입니다.

Object.prototype.toString.call(a) // [object Object]

var b;

b는 정의되지 않고 초기화되지 않은

정의되지 않은 객체 속성도 정의되지 않습니다. 예를 들어 "x"는 객체 c에 정의되어 있지 않으며 cx에 액세스하려고하면 정의되지 않은 상태로 반환됩니다.

일반적으로 정의되지 않은 변수에 null을 할당합니다.


1
Object.prototype.toString.call(null); // "[object Null]"
Paul S.

3

이 주제에 관한 Ryan Morr의 철저한 기사

"일반적으로 변수 나 속성에 값이 아닌 값을 할당하거나 함수에 전달하거나 함수에서 반환해야하는 경우 null이 거의 항상 최선의 선택입니다. 간단히 말하면 JavaScript는 정의되지 않은 것이므로 프로그래머는 null을 사용하십시오. "

영원하고 정의되지 않은 영원한 심연 살펴보기


3

JavaScript에서 Null과 undefined는 모두 값이 없음을 나타냅니다.

var a = null; //variable assigned null value
var b;  // undefined

사실 둘 다 가치가없는 경우에도 존재하지만 정의되지 않음은 실제로 변수가 초기화되지 않았 음을 의미합니다. 아무것도 반환하지 않는 함수와 값이 제공되지 않은 함수 매개 변수는 정의되지 않은 값이 반환됩니다. Null과 Undefined를 구분하려면 엄격한 항등 연산자 ===를 사용하십시오.

참조 : http://www.thesstech.com/javascript/null-and-undefined


3

OK, 우리는 우리가들을 때 혼란을 얻을 수 nullundefined하지만,하자가 간단, 둘은 시작 falsy 그들 유의 한 차이가 몇 만들고, 여러 가지면에서 비슷하지만 자바 스크립트의 이상한 부분, 예를 들어 대해서 typeof는 null 것입니다 'object'동안 대해서 typeof가 undefined 있다 'undefined'.

typeof null; //"object"
typeof undefined; //"undefined";

그러나 ==아래와 같이 확인하면 둘 다 거짓임을 알 수 있습니다 .

null==undefined; //true

또한 null객체 속성이나 프리미티브에 할당 할 수 있습니다.undefined 할당 할 수 있지만 아무 것도 할당하지 않으면 간단히 달성 할 수 있습니다.

한 눈에 차이점을 보여주는 빠른 이미지를 만듭니다.

널 및 정의되지 않음


2

typeof가 undefined를 반환하므로 undefined는 null이 초기화 자로 변수가 객체를 가리 키지 않음을 나타냅니다 (Javascript의 모든 것이 객체 임).


2

자바 스크립트에서 모든 변수는 키 값 쌍으로 저장됩니다. 각 변수는 variable_name : variable_value / reference 로 저장됩니다 .

찾으시는 주소가 없습니다 는 변수에 메모리에 공백이 주어졌지만 값이 할당 의미합니다. 모범 사례로이 유형을 할당으로 사용해서는 안됩니다.

이 경우 나중에 코드에서 변수가 값이없는 시점을 나타내는 방법은 무엇입니까? null 유형을 사용할 수 있습니다.이 유형 은 값이없는 동일한 것을 정의하는 데 사용되는 유형이지만이 경우 실제로 메모리에 값이있는 것처럼 정의되지 않은 것과 다릅니다. 그 값은 null

둘 다 비슷하지만 사용법과 의미가 다릅니다.


2

나는 사이에 아주 미묘한 차이를 추가 할 null그리고 undefined당신이 지상에서 바닐라 자바 스크립트 (JS)을 배우려고 할 때 알 수있는 좋은이다 :

  • null는 JS에서 예약 된 키워드 인 반면 undefined현재 런타임 환경의 전역 객체에 대한 변수입니다.

코드를 작성하는 동안,이 차이는 모두 같은 식별하지 않습니다 nullundefined항상 자바 스크립트 구문의 RHS에 사용됩니다. 그러나 LHS에서 표현식을 사용하면 이러한 차이를 쉽게 관찰 할 수 있습니다. 따라서 JS 인터프리터는 아래 코드를 오류로 해석합니다.

var null = 'foo'

아래 오류가 발생합니다.

잡히지 않은 구문 오류 : 예기치 않은 토큰 널

실제 생활에서 권장하지는 않지만 아래 코드가 성공적으로 실행되는 동안 :

var undefined = 'bar'

이것은 undefined전역 객체 (클라이언트 측 JS의 경우 브라우저 창 객체)의 변수 이기 때문에 작동합니다.


1
undefined='bar'실제로 undefined불변의 값을 할당 하지 않고 혼란스럽게 오류를 발생시키지 않습니다.
Dmitri Zaitsev

1

차이 undefinednull최소이지만, 차이가있다. 값이 undefined초기화 된 적이없는 변수입니다 . 값 null에 명시 적으로 값이 지정된 null변수는 변수가 명시 적으로 값을 갖지 않도록 설정되었음을 의미합니다. 식 을 비교 undefined하고 null사용하면 null==undefined식이 같습니다.


이 답변은 잘못된 것입니다 ... 수락 된 답변의 토론을 참조하십시오. 결론 - null==undefinedtrue만 때문에 내재적 주조 (또는 JS에 상당 기간)의. 분명히 null===undefined입니다 false사용할 때 사용하기 때문에 ===그것은 비교 유형을 잘한다.
guyarad

1

기본적으로 Undefined 는 null이 변수에 할당 된 값이 없음을 의미하는지 (실제로 null 자체가 객체 임) 여부에 관계없이 런타임에 Javascript가 작성하는 전역 변수입니다.

예를 들어 보자.

        var x;  //we declared a variable x, but no value has been assigned to it.
        document.write(x) //let's print the variable x

정의되지 않은 것은 출력으로 얻을 것입니다.

지금,

        x=5;
        y=null;
        z=x+y;

그리고 당신은 출력으로 5 를 얻을 것 입니다. 이것이 Undefinednull 의 주요 차이점입니다.


1

null- 값을 나타내지 않기 위해 변수와 함께 사용되는 대입 값입니다 (객체 임).

undefined- 값이 지정되지 않은 변수이므로 JavaScript는 undefined를 지정합니다 (데이터 유형).

undeclared- 변수가 전혀 생성되지 않으면 선언되지 않은 것으로 알려져 있습니다.


1

이것 좀 봐. 결과는 천 단어의 가치가 있습니다.

var b1 = document.getElementById("b1");

checkif("1, no argument"                        );
checkif("2, undefined explicitly",     undefined);
checkif("3, null explicitly",               null);
checkif("4, the 0",                            0);
checkif("5, empty string",                    '');
checkif("6, string",                    "string");
checkif("7, number",                      123456);

function checkif (a1, a2) {
	print("\ncheckif(), " + a1 + ":");
	if (a2 == undefined) {
		print("==undefined:    YES");
	} else {
		print("==undefined:    NO");
	}
	if (a2 === undefined) {
		print("===undefined:   YES");
	} else {
		print("===undefined:   NO");
	}
	if (a2 == null) {
		print("==null:         YES");
	} else {
		print("==null:         NO");
	}
	if (a2 === null) {
		print("===null:        YES");
	} else {
		print("===null:        NO");
	}
	if (a2 == '') {
		print("=='':           YES");
	} else {
		print("=='':           NO");
	}
	if (a2 === '') {
		print("==='':          YES");
	} else {
		print("==='':          NO");
	}
	if (isNaN(a2)) {
		print("isNaN():        YES");
	} else {
		print("isNaN():        NO");
	}
	if (a2) {
		print("if-?:           YES");
	} else {
		print("if-?:           NO");
	}
		print("typeof():       " + typeof(a2));
}

function print(v) {
	b1.innerHTML += v + "\n";
}
<!DOCTYPE html>
<html>
<body>
<pre id="b1"></pre>
</body>
</html>

또한보십시오:

건배!


1
이것으로부터 나는 실제로 그 isNaN(null)반환을 배웠습니다 false.
J. Bruni

0

두 특수 값 모두 빈 상태를 의미합니다.

가장 큰 차이점은 undefined 는 아직 초기화되지 않은 변수의 값을 나타내고 null 은 의도적으로 객체가 없음을 나타냅니다.

그러나 변수 번호가 정의되어 있지만 초기 값이 지정되지 않았습니다.

let number;
number; // => undefined

숫자 변수가 정의되지 않았으며 초기화되지 않은 변수를 명확하게 나타냅니다.

존재하지 않는 객체 속성에 액세스 할 때 초기화되지 않은 동일한 개념이 발생합니다.

const obj = { firstName: 'Dmitri' };
obj.lastName; // => undefined

lastName 속성이 obj에 없기 때문에 JavaScript는 obj.lastName을 정의되지 않은 것으로 올바르게 평가합니다.

다른 경우에는 변수가 객체 또는 객체를 반환하는 함수를 보유 할 것으로 예상한다는 것을 알고 있습니다. 그러나 어떤 이유로 든 객체를 인스턴스화 할 수 없습니다. 이러한 경우 null은 누락 된 개체를 나타내는 의미있는 지표입니다.

예를 들어 clone ()은 일반 JavaScript 객체를 복제하는 함수입니다. 이 함수는 객체를 반환 할 것으로 예상됩니다 :

function clone(obj) {
  if (typeof obj === 'object' && obj !== null) {
    return Object.assign({}, obj);
  }
  return null;
}
clone({name: 'John'}); // => {name: 'John'}
clone(15);             // => null
clone(null);           // => null

그러나 clone ()은 객체가 아닌 인수 15 또는 null (또는 일반적으로 기본 값인 null 또는 undefined)을 사용하여 호출 할 수 있습니다. 이 경우 함수는 복제본을 만들 수 없으므로 누락 된 개체의 지표 인 null을 반환합니다.

typeof 연산자는 두 값을 구별합니다.

typeof undefined; // => 'undefined'
typeof null;      // => 'object'

엄격한 품질 연산자 ===는 undefined와 null을 올바르게 구분합니다.

let nothing = undefined;
let missingObject = null;
nothing === missingObject; // => false

0

다른 의미 외에도 다른 차이점이 있습니다.

  1. 객체 파괴 는이 두 값에 대해 다르게 작동합니다.
    const { a = "default" } = { a: undefined }; // a is "default"
    const { b = "default" } = { b: null };      // b is null
  2. JSON.stringify ()는 유지 null하지만 생략합니다.undefined
    const json = JSON.stringify({ undefinedValue: undefined, nullValue: null });
    console.log(json); // prints {"nullValue":null}
  3. typeof 연산자
    console.log(typeof undefined); // "undefined"
    console.log(typeof null);      // "object" instead of "null"

-2

변수가 초기화되지 않으면 정의되지 않습니다. undefined는 객체가 아닙니다. 예 : var MyName; console.log (typeof MyName);

개발 도구에서 콘솔 로그를 확인하면 정의되지 않은 상태로 인쇄됩니다.

null은 a 객체입니다. 일부 변수를 null로 사용하려면 null이 사용됩니다 .null 변수는 존재하지만 값을 알 수 없습니다. null은 자동으로 초기화되지 않습니다.

예 : var MyName = null; console.log (typeof MyName); 개발 도구에서 csole 로그를 확인하면 개체가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.