JavaScript에서 null과 정의되지 않은 것의 차이점은 무엇입니까?

다른 점이 뭔지 알고 싶어요null그리고.undefinedJavaScript에 있습니다.



질문에 대한 답변



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' 



차이점은 화장실 휴지 홀더로 설명할 수 있습니다.

  • 0이 아닌 값은 화장지 롤이 있는 홀더와 같고 튜브에 휴지가 남아 있는 것과 같습니다.

  • 0 값은 화장실 휴지통이 비어 있는 홀더와 같습니다.

  • null 값은 휴지관이 없는 홀더와 같습니다.

  • 정의되지 않은 값은 홀더 자체가 누락되는 것과 유사합니다.




여기서 골랐어요.

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

null 값은 null, 빈 참조 또는 존재하지 않는 참조를 나타내는 원시 값입니다.

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

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

변수를 선언하고 null로 설정할 수 있습니다.동작은 “null”이 출력되는 것과 “정의되지 않은”이 표시되는 것을 제외하고 동일합니다.이것은 정말 작은 차이입니다.

null 또는 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 is null or not object’라는 두려움이 느껴집니다.그것은 운이 좋은 경우입니다(다만, 이것은 다른 기사의 토픽입니다).

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

정의되지 않은 팝업이 표시되는 다른 예는 delete 연산자를 사용하는 경우입니다.C-world에서 온 사람들은 이것을 물체를 파괴하는 것으로 잘못 해석할 수도 있지만, 그렇지 않습니다.이 작업은 배열에서 첨자를 제거하거나 개체에서 구성원을 제거하는 작업을 수행합니다.배열의 경우 길이는 영향을 주지 않지만, 그 첨자는 정의되지 않은 것으로 간주됩니다.

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과 defined의 차이는 JavaScript는 아무것도 null로 설정하지 않는다는 것입니다.이것은 보통 우리가 하는 일입니다.변수를 정의되지 않음으로 설정할 수 있지만 null을 선호합니다. null은 우리에게 전혀 적용되지 않기 때문입니다.디버깅을 할 경우 null로 설정된 것은 모두 JavaScript가 아닌 사용자 자신의 작업임을 의미합니다.그 밖에도, 이 두 개의 특별한 값은 거의 동일합니다.




다음을 주의 깊게 읽어 주십시오.그럼 두 사람 사이의 차이에 대한 모든 의심을 없앨 수 있을 겁니다null그리고.undefinedJavaScript에 있습니다.또한 이 답변의 끝에 있는 유틸리티 함수를 사용하여 보다 구체적인 유형의 변수를 얻을 수 있습니다.

JavaScript에서는 다음과 같은 유형의 변수를 사용할 수 있습니다.

  1. 선언되지 않은 변수
  2. 선언되었지만 할당되지 않은 변수
  3. 리터럴로 할당된 변수undefined
  4. 리터럴로 할당된 변수null
  5. 변수와 함께 할당된 변수:undefined또는null

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

  1. 선언되지 않은 변수

    • 체크할 수 있는 것은typeof문자열 ‘filename을 반환하는 연산자
    • 느슨한 등호 연산자로 확인할 수 없습니다(== undefined엄밀한 등가 연산자는 말할 것도 없습니다.=== undefined),
      if-statement3진 연산자(? :): 참조 에러가 발생합니다.
  2. 선언되었지만 할당되지 않은 변수

    • typeof문자열 ‘filename을 반환합니다.
    • ==에 확인하다.null돌아온다true
    • ==에 확인하다.undefined돌아온다true
    • ===에 확인하다.null돌아온다false
    • ===에 확인하다.undefined돌아온다true
    • if-statement3진 연산자에 대해 거짓(? :)
  3. 리터럴로 할당된 변수undefined
    이러한 변수는 선언되었지만 할당되지 않은 변수와 동일하게 취급됩니다.

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

    • typeof문자열 ‘object를 반환합니다.
    • ==에 확인하다.null돌아온다true
    • ==에 확인하다.undefined돌아온다true
    • ===에 확인하다.null돌아온다true
    • ===에 확인하다.undefined돌아온다false
    • if-statement3진 연산자에 대해 거짓(? :)
  5. 변수와 함께 할당된 변수:undefined또는null

    • type of은 ‘bigint‘,function’, ‘number‘,object‘,string‘,function‘, ‘number 등의 문자열 중 하나를 반환합니다.

변수의 올바른 유형 확인을 위한 알고리즘을 다음에 나타냅니다.

  1. 입수하다typeof변수가 ‘객체’가 아닌 경우 반환한다.
  2. 확인하다null,~하듯이typeof nullobject도 반환한다.
  3. 보다 정확한 값을 반환하려면 스위치 문을 사용하여 Object.protype.toString.call(o)평가합니다. ObjecttoString메서드는 네이티브/호스트 개체에 대해 ‘[object ConstructorName]’과 같은 문자열을 반환합니다.다른 모든 개체(사용자 정의 개체)의 경우 항상 ‘[개체]’를 반환합니다.
  4. 마지막 부분이 해당 경우(변수의 문자열화된 버전이 ‘[개체 객체]’이며 파라미터 returnConstructorBoolean은true, 컨스트럭터의 이름을 취득하려고 합니다.toString– 거기서 이름을 추출해 냈습니다.생성자에 연결할 수 없는 경우 ‘object’가 평소처럼 반환됩니다.문자열에 이름이 포함되지 않으면 ‘anonymous’가 반환됩니다.

(ECMAScript 2020까지 모든 유형 지원)

function TypeOf(o, returnConstructorBoolean) {
const type = typeof o
if (type !== 'object') return type
if (o === null)
return 'null'
const toString = Object.prototype.toString.call(o)
switch (toString) {
// Value types: 6
case '[object BigInt]':
return 'bigint'
case '[object Boolean]':
return 'boolean'
case '[object Date]':

return 'date'
case '[object Number]':
return 'number'
case '[object String]':
return 'string'
case '[object Symbol]':
return 'symbol'
// Error types: 7
case '[object Error]':
 return 'error'
case '[object EvalError]':
return 'evalerror'
case '[object RangeError]':
return 'rangeerror'
case '[object ReferenceError]':
return 'referenceerror'
case '[object SyntaxError]':
return 'syntaxerror'
case '[object TypeError]':
return 'typeerror'
case '[object URIError]':
return 'urierror'
// Indexed Collection and Helper types: 13
case '[object Array]':
 return 'array'
case '[object Int8Array]':
return 'int8array'
case '[object Uint8Array]':
return 'uint8array'
case '[object Uint8ClampedArray]': return 'uint8clampedarray'
case '[object Int16Array]':
return 'int16array'
case '[object Uint16Array]':
return 'uint16array'
case '[object Int32Array]':
return 'int32array'
case '[object Uint32Array]':
return 'uint32array'
case '[object Float32Array]':
return 'float32array'
case '[object Float64Array]':
return 'float64array'
case '[object ArrayBuffer]':
return 'arraybuffer'
case '[object SharedArrayBuffer]': return 'sharedarraybuffer'
case '[object DataView]':
return 'dataview'
// Keyed Collection types: 2
case '[object Map]':

return 'map'
case '[object WeakMap]':
return 'weakmap'
// Set types: 2
case '[object Set]':

return 'set'
case '[object WeakSet]':
return 'weakset'
// Operation types: 3
case '[object RegExp]':
return 'regexp'
case '[object Proxy]':
 return 'proxy'
case '[object Promise]':
return 'promise'
// Plain objects
case '[object Object]':
if (!returnConstructorBoolean)
return type
const _prototype = Object.getPrototypeOf(o)
if (!_prototype)

return type
const _constructor = _prototype.constructor
if (!_constructor)

return type
const matches = Function.prototype.toString.call(_constructor).match(/^functions*([^s(]+)/)
return matches ? matches[1] : 'anonymous'
default: return toString.split(' ')[1].slice(0, -1)
} } 



null은 값의 부재를 나타내는 특별한 키워드입니다.

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

  • “foo”는 문자열입니다.
  • true는 부울입니다.
  • 1234는 숫자입니다.
  • null은 정의되지 않았습니다.

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

var foo; 

정의된 빈 변수는null데이터형undefined


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

그리고. 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