javascript - 치환 - undefined 뜻




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

JavaScript에서 nullundefined 의 차이점을 알고 싶습니다.


JavaScript에서 Null과 undefined는 모두 값의 부재를 나타냅니다.

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

사실에도 불구하고 둘 다 값의 부재로 존재하지만 사실 : Undefined는 실제로 변수가 초기화되지 않았 음을 의미합니다. 값을 제공하지 않는 함수와 매개 변수를 반환하는 함수는 정의되지 않은 값을 반환합니다. 완전 항등 연산자 ===를 사용하여 null과 undefined를 구별합니다.

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


시스템 수준, 예기치 않은 또는 오류와 같은 값 부재를 나타내려면 undefined를, 프로그램 수준, 정상 또는 예상 값 부재를 나타낼 때는 null을 고려할 수 있습니다.

JavaScript를 통해 : The Definitive Guide


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

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

Null은 할당입니다.

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

null 값과 undefined 값은 둘 다 값의 부재를 나타내는 데 사용됩니다.

var a = null;

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

typeof(a)
//object

null은 JavaScript의 객체입니다.

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

var b;

b는 정의되지 않고 초기화되지 않습니다.

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

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


typeof는 undefined를 반환하므로 undefined는 변수가 객체를 가리 키지 않음을 나타내는 null이 초기화 자라는 유형입니다 (실제로 자바 스크립트의 모든 것이 객체입니다).


값이 null 인 경우, 값은 아무것도 아니며 아무것도 포함하지 않습니다. 빈 값이나 변수가 여전히 가득 찼습니다. 공허함으로 가득 차 있습니다. 공허함은 널 (null)과 다르다. 예를 들어, 변수를 정의하고 값을 빈 문자열로 설정하면 다음과 같습니다.

 var myVariable = ''; 

myVariable 변수는 비어 있지만 null이 아닙니다.

Undefined값이 아닌 변수를 나타 내기 위해 때때로 값처럼 사용되는 상태입니다. 같은 var abcd; . 이 상태는 null과 다르지만 null과 undefined가 같은 방식으로 평가할 수 있습니다.


다음을주의 깊게 읽으십시오. 자바 스크립트에서 nullundefined 의 차이에 관한 모든 의문점을 제거합니다. 또한 아래 주어진 유틸리티 함수를 사용하여 유형을 정확하게 결정할 수 있습니다.

자바 스크립트에서 우리는 다음과 같은 유형의 변수를 가질 수 있습니다.

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

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

  1. 선언되지 않은 변수 : 선언되지 않은 변수는 다음과 같습니다.

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

    • typeof 는 문자열 'undefined'를 반환합니다.
    • == null 로 검사하면 true를 반환 합니다.
    • == undefined 로 검사하면 true를 반환 합니다.
    • === null 로 확인하면 false를 반환합니다.
    • === undefined 로 검사하면 true를 반환 합니다.
    • if 또는 조건 연산자 ? false를 반환합니다.
  3. 리터럴이 정의되지 않은 변수 : 이러한 변수는 선언 되었지만 할당되지 않은 변수 와 비슷하게 처리됩니다.

  4. 리터럴 null로 할당 된 변수

    • typeof 는 문자열 'object'를 반환합니다.
    • == null 로 검사하면 true를 반환 합니다.
    • == undefined 로 검사하면 true를 반환 합니다.
    • === null 로 확인하면 true를 반환 합니다.
    • === undefined 로 검사하면 false가 반환됩니다.
    • if 또는 조건 연산자 ? false를 반환합니다.
  5. 정의되지 않은 변수 또는 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 
}

우리는 nullundefined 에 대해 들었을 때 혼란 스러울 지 모르지만 간단하게 시작해 보겠습니다. 둘 다 위선적이며 여러면에서 유사하지만 JavaScript의 이상한 부분은 상당한 차이가 있습니다. 예를 들어, typeof null'object' 이며 undefined'undefined' 입니다.

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

그러나 아래에서와 같이 == 를 사용하여 확인하면 두 가지가 위선이라고 볼 수 있습니다.

null==undefined; //true

또한 객체 프로퍼티 또는 프리미티브에 null 을 할당 할 수 있지만 undefined 는 단순히 아무 것도 지정하지 않으면 얻을 수 있습니다.

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


자바 스크립트에서 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

앞의 예제에서 undefinednull 은 두 가지 고유 한 유형입니다. undefined 는 유형 자체 (정의되지 않음)이며 null 은 객체입니다.

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

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

자바 스크립트에서 변수를 선언하면 undefined 값이 할당됩니다. 이것은 변수가 변경되지 않았 음을 의미하며 미래에 어떤 값을 할당 할 수 있습니다. 또한이 변수가 선언시 보유 할 값을 알지 못함을 의미합니다.

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

이제 다른 사람이 당신의 person 객체의 middlename 변수에 접근하고 있다고 가정하고 undefinedundefined 집니다. 그는 개발자가이 변수를 초기화하는 것을 잊었는지 또는 어떤 가치도 없는지 여부를 알 수 없습니다. 값이 null 사용자는 middlename에 값이 없으며 변경되지 않은 변수라고 쉽게 추측 할 수 있습니다.


차이점을 이해하는 가장 좋은 방법은 먼저 자바 스크립트의 내부 동작에 대한 마음을 밝히고 그 의미의 차이를 이해하는 것입니다.

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.

이 세 가지 경우의 의미에는 차이가 있으며, 자바 스크립트는 후자의 두 경우를 nullundefined 라는 두 가지 다른 값으로 구분합니다. 이러한 값을 명시 적으로 사용하여 해당 의미를 전달할 수 있습니다.

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

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

    let supervisor;
    assert(supervisor === undefined);
    
  2. 아무도 그 속성에 대해 아무 말도하지 않았기 때문에 결코 설정 undefined 객체의 속성은 undefined 것으로 평가됩니다.

    const dog = { name: 'Sparky', age: 2 };
    assert(dog.breed === undefined);
    
  3. Brendan Eich가 그렇게 말했기 때문에 nullundefined 는 서로 "유사"합니다. 그러나 그들은 서로 단호하게 일치하지 않습니다.

    assert(null == undefined);
    assert(null !== undefined);
    
  4. nullundefined 고맙게도 다른 타입을 가진다. nullNull 유형에 속하며 Undefined 유형에는 Undefined 입니다. 이것은 사양에 있지만, 당신이 여기에 반복하지 않을 유형의 이상한 것들 때문에 이것을 결코 알지 못할 것입니다.

  5. 명시 적 return 문없이 본문의 끝에 도달하는 함수는 반환 된 내용에 대해 알지 못하기 때문에 undefined 반환합니다.

그런데 JavaScript에는 "무의미한"형태가 있습니다 (철학을 공부하는 것이 좋습니다 ...).

  • NaN
  • 한 번도 선언되지 않은 변수를 사용하고 ReferenceError 받는
  • let 또는 const 정의 된 지역 변수를 임시적인 데드 존에서 사용하고 ReferenceError 받는다.
  • 희소 배열에있는 빈 셀. 네, 이것들은 === undefined와 비교하지만 정의되지 않았습니다.

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

null 은 "값 없음"을 의미하는 특수한 값입니다. nulltypeof null 이 'object'를 반환하기 때문에 특별한 객체입니다.

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


undefinednull 의 차이는 작지만 차이가 있습니다. 값이 undefined 변수는 초기화되지 않았습니다. 값이 null 인 변수에는 null 값이 명시 적으로 지정 null 변수에 명시 적으로 값이 설정되지 않았습니다. null==undefined 표현식을 사용하여 undefinednull 을 비교하면 이들이 동일 해집니다.


undefined 유형의 경우 하나의 값만 있습니다.

null 유형의 경우 하나의 값만이 있습니다.

따라서 두 가지 모두에 대해 레이블은 해당 유형과 값입니다.

그들 사이의 차이. 예 :

  • null 는 하늘의 값
  • undefined 값입니다.

또는:

  • undefined 값이 아직 없습니다.
  • null 은 가치가 있었고 더 이상 존재하지 않습니다.

사실, null 은 식별자가 아닌 특수 키워드 이므로 할당 할 변수로 취급 할 수 없습니다.

그러나 undefined식별자 입니다. 그러나 non-strict 모드와 strict 모드 모두에서 undefined 이름의 로컬 변수를 만들 수 있습니다. 그러나 이것은 하나의 끔찍한 생각입니다!

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

foo();

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

foo();

null : 변수에 대한 값 부재. undefined : 변수 자체의 부재;

..where 변수는 값과 연관된 기호 이름입니다.

JS는 새롭게 선언 된 변수를 null 로 암시 적으로 초기화 할만큼 친절 할 수 있지만 그렇지 않습니다.


nullundefined 는 다음 두 가지 공통 객체 유형입니다.

  • 둘 다 각각 단일 값, nullundefined를 보유 할 수 있습니다.
  • 둘 다 속성이나 메서드가 없으며 둘 중 하나의 속성을 읽으려고하면 런타임 오류가 발생합니다 (다른 모든 개체의 경우 존재하지 않는 속성을 읽으려고하면 값이 정의되지 않습니다 ).
  • null 값과 undefined 값은 서로 같고 ==!= 연산자에 의해 다른 것으로 간주됩니다.

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

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

undefined , NaNInfinity 는 초기화 된 "superglobal"변수의 이름입니다. 런타임시 초기화되며 동일한 이름을 가진 일반 전역 변수 나 지역 변수로 재정의 될 수 있습니다.

자, 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 (!!!)

산술 표현식이나 숫자 비교에서 null을 사용하면 null 이됩니다. false 와 마찬가지로 기본적으로는 특별한 종류의 "0"입니다. 반면에 undefined 는 참된 "nothing"이며 수치 적 맥락에서 사용하려고하면 NaN ( "숫자가 아님")이됩니다.

nullundefined==!= 연산자에서 특별한 대우를 받지만 ab 의 실제 숫자 동등성은 표현식 (a >= b && a <= b) 사용하여 테스트 할 수 있습니다.


null 은 일반적으로 값이 없음을 나타 내기 위해 사용되는 특별한 값으로 평가되는 언어 키워드입니다. null에서 typeof 연산자를 사용하면 null이 "객체 없음"을 나타내는 특수 객체 값으로 간주 될 수 있음을 나타내는 문자열 "object"를 반환합니다. 그러나 실제로는 null이 일반적으로 자체 유형의 유일한 멤버로 간주되며 숫자와 문자열 및 객체에 대해 "값 없음"을 나타내는 데 사용될 수 있습니다. 대부분의 프로그래밍 언어는 JavaScript의 null과 동일합니다. null 또는 nil로 익숙 할 수 있습니다.

또한 JavaScript에는 가치가 없음을 나타내는 두 번째 값이 있습니다. 정의되지 않은 값은 더 깊은 종류의 부재를 나타냅니다. 초기화되지 않은 변수의 값과 존재하지 않는 객체 속성 또는 배열 요소의 값을 쿼리 할 때 얻는 값입니다. 정의되지 않은 값은 리턴 값이없는 함수와 인수가 제공되지 않은 함수 매개 변수의 값으로도 리턴됩니다. undefined는 정의되지 않은 값으로 초기화되는 사전 정의 된 전역 변수 (null과 같은 언어 키워드가 아님)입니다. ECMAScript 3에서 undefined는 읽기 / 쓰기 변수이며 모든 값으로 설정할 수 있습니다. 이 오류는 ECMAScript 5에서 수정되었으며 undefined는 해당 언어 버전에서 읽기 전용입니다. 정의되지 않은 값에 typeof 연산자를 적용하면 "undefined"가 반환되어이 값이 특수 유형의 유일한 멤버임을 나타냅니다.

이러한 차이에도 불구하고 null과 undefined는 둘 다 값의 부재를 나타내며 종종 교환 가능하게 사용될 수 있습니다. 항등 연산자 ==는 항등 연산자가 같다고 간주합니다. (완전 항등 연산자 ===를 사용하여 구별합니다.) 둘 다 거짓 값입니다. 부울 값이 필요할 때 false와 같이 동작합니다. null도 undefined도 속성이나 메서드를 가지고 있지 않습니다. 사실, 사용하고 있습니다. 또는 []를 사용하여 이러한 값의 속성이나 메서드에 액세스하면 TypeError가 발생합니다.

시스템 수준, 예기치 않은 또는 오류와 같은 값 부재를 나타내려면 undefined를, 프로그램 수준, 정상 또는 예상 값 부재를 나타낼 때는 null을 고려할 수 있습니다. 이러한 값 중 하나를 변수 나 속성에 할당하거나이 값 중 하나를 함수에 전달해야하는 경우 null은 거의 항상 올바른 선택입니다.


내 의견을 추가하려면 -

선언 된 변수 만 C ++와 같은 컴파일 된 언어의 경우 최적화 컴파일러에 의해 제거되거나 [IDE에 경고가 표시됩니다]. 결국 메모리가 할당되지 않기 때문에 변수가 존재하지 않는다는 것을 의미합니다.

자바 스크립트 인터프리터의 경우 변수는 값이 주어진 지점에서부터 존재하는 것으로서 만 처리됩니다. 이 시점 이전에는 유형이 "정의되지 않음"이었고 메모리가 할당되지 않았습니다. 그리고 그것의 타입은 정의되지 않았습니다.

자바 스크립트는 널 이다 어드레스를 나타내는 값, 아직 아무것도 [존재 참조]에 해당 주소를 가리킨다. 그럼에도 불구하고 그것의 가치.


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

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

null는 aa 객체입니다. 일부 변수가 null이면 null이 사용됩니다. null 변수가 있지만 값을 알 수 없습니다. 문법적으로 변수에 변수를 할당해야합니다. null는 자동적으로 초기화되지 않습니다.

예 : var MyName = null; console.log (typeof MyName); 개발 도구에서 csole 로그를 확인하십시오.


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

undefined 는 변수가 메모리에 공백을두고 있지만 값이 지정 되지 않았 음을 의미합니다. 가장 좋은 방법은이 유형을 과제로 사용하지 않아야합니다.

이 경우 코드의 나중 시점에 변수가 가치가 없도록하려는 경우를 나타내는 방법은 무엇입니까? 같은 타입을 정의하는데 사용되는 타입 인 널 (null ) 타입을 사용할 수 있습니다.이 타입 은 값의 부재입니다.하지만이 경우에는 실제로 메모리에 값이 있습니다. 그 값은 null입니다.

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







undefined