typeof가 null "개체"인 이유는 무엇입니까?


242

'웹 개발자를위한 전문 Javascript'4 장을 읽고 5 가지 기본 유형은 정의되지 않음, 널, 부울, 숫자 및 문자열이라는 것을 알려줍니다.

만약이 null이유는 무엇입니까, 원시적 인 typeof(null)수익 "object"?

그것은 그것이 null참조로 전달 된다는 것을 의미 하지 않습니까 (여기서는 모든 객체가 참조로 전달된다고 가정합니다).


50
답변 : 사양에 나와 있기 때문입니다. 이것은 일반적으로 실수로 간주됩니다.
SLaks

5
typeof는 함수가 아닌 연산자이며 실제로 뒤에 오는 것을 괄호를 생략 할 수 있으므로 여기에서 참조로 전달하는 것에 대해 이야기하는 것은 의미가 없습니다. "자바 스크립트 : 좋은 부분"책은 실제로 부록 A의 A.6 섹션에 'Awful Parts'라는 제목의 typeof null === 'object'라는 사실을 언급하고 있습니다.
John Sonderson

5
나는 'Awful Parts'를 읽고 싶다고 생각합니다
austinheiman

1
헤아릴 수없는 큰 실수! :)
Alexander Mills

2
변수의 값 유형을 확인하기 위해 typeof 대신 무엇을 사용해야합니까? 나는 그것이 무엇인지 알고 싶습니다 (부울, 문자열, 숫자, 배열, 객체, 함수, 기호, null, 정의되지 않음, NaN)
Costa

답변:


219

운영자 의 행동에 대한 MDN 페이지typeof 에서 :

null

// JavaScript가 시작된 이래로
typeof null === '개체';

JavaScript의 첫 번째 구현에서 JavaScript 값은 유형 태그와 값으로 표시되었습니다. 객체의 유형 태그는 0입니다 null. NULL 포인터 (대부분의 플랫폼에서 0x00)로 표시되었습니다. 결과적으로 null은 유형 태그로 0을 가지므로 "object" typeof반환 값입니다. ( 참고 )

ECMAScript에 대한 수정 (옵트 인을 통해)이 제안되었지만 거부되었습니다 . 결과는 typeof null === 'null'이었습니다.


138
이 변경으로 인해 엄격 모드로 변경되지 않은 것은 부끄러운
Ingo Bürk

사람들은이 문제를 이용하고 있으며, 이것이 거부되지 않으면 많은 코드가 변경되어야한다고 생각합니다.
Cold Cerberus

코드를 변경하기를 원하는 소수의 살아있는 사람들은 나머지 개발자가 나머지 시간 동안 코드를 배우는 것이 더 합리적입니다. 사람이 아직 존재하지 않는다고해서 반드시 중요하지 않다는 것을 의미하는 것은 아니며, 무방비 상태라는 의미 일뿐입니다.
Seph Reed

사람들이 왜 이것을 null 확인으로 사용하는지 이해가되지 않습니다. 직관적으로 이해가되지 않는 이유는 무엇입니까? 코딩이 잘못되어 변경 사항을 추가 할 수 없습니다.
Emobe

69

만약이 null이유는 무엇입니까, 원시적 인 typeof(null)수익 "object"?

때문에 사양이 그렇게 말한다 .

11.4.3typeof 운영자

UnaryExpression : typeof UnaryExpression 프로덕션 은 다음과 같이 평가됩니다.

  1. 하자 발은 평가의 결과 UnaryExpression을 .
  2. 경우 유형 ( 발은 )는 참조 후,
       가. 경우 IsUnresolvableReference ( 발은 )는 사실 , "반환 undefined".
       비. 하자 GetValue ( ).
  3. 표 20에 따라 Type ( val )에 의해 결정된 문자열을 리턴하십시오 .

여기에 이미지 설명을 입력하십시오


@ peter typeof은 무언가에 대해 메소드를 호출 할 수 있는지 여부에 대해서는 아무 것도 알려주지 않습니다.
Matt Ball

2
내 지식으로는 null및 이외의 다른 방법으로 메소드를 호출 할 수 있습니다 undefined.
Matt Ball

4
@peter 문자열 프리미티브에서는 메소드를 호출 할 수 없지만 문자열 프리미티브 (및 숫자 프리미티브 및 부울 프리미티브)는 속성과 함께 프리미티브 중 하나를 사용할 때 문자열, 숫자 및 부울 래퍼에서 암시 적으로 자동으로 "자동 박스"됩니다 참조 연산자 ( .또는 [ ]).
Pointy

28

지적 된 바와 같이, 스펙은 그렇게 말한다. 그러나 JavaScript 구현은 ECMAScript 사양을 작성하기 이전에 시작되었으며이 사양은 초기 구현의 우화를 수정하지 않도록주의를 기울 였기 때문에 처음에 왜 이런 방식으로 수행되었는지에 대한 합법적 인 질문이 남아 있습니다. Douglas Crockford 는 이것을 실수라고 부릅니다 . Kiro Risk 는 다소 의미가 있다고 생각합니다 .

뒤에 숨겨진 이유는와 null달리 undefined객체가 나타나는 곳에 자주 사용되기 때문입니다. 즉, null종종 객체에 대한 빈 참조를 나타내는 데 사용됩니다. Brendan Eich가 JavaScript를 만들었을 때도 동일한 패러다임을 따르고 "개체"를 반환하는 것이 합리적이었습니다. 실제로 ECMAScript 사양은 의도적으로 객체 값이 없음을 나타내는 기본 값null 으로 정의 합니다 (ECMA-262, 11.4.11).


3
지금은 비디오를 찾을 수 없기 때문에 호기심이 많은 사람들을 위해이 기사를 게시 할 것입니다 .Crockford는 null 유형을 해결할 때 0 값이 types 배열의 0 인덱스 요소를 가리키는 방법을 설명 했으므로 분명했습니다. 브라우저에서 JS를 디 컴파일 및 재 컴파일 할 때 Microsoft
직원이

6

책에서 YDKJS

이것은 JS의 오랜 버그이지만 결코 수정되지 않을 것입니다. 웹에서 너무 많은 코드는 버그에 의존하므로 수정하면 훨씬 더 많은 버그가 발생합니다!


1
모든 것이 책에 쓰여 있다는 것을 믿지 마십시오. 나는 그 책을 정말 좋아하지만 JavaScript에 대한 ECMA 사양이 null 유형이 객체 여야한다고 명시하기 때문에 버그를 고려할 수 없습니다.
andreasonny83

4

만약이 null이유는 무엇입니까, 원시적이다 typeof(null)"반환 object"?

요컨대 ECMAScript의 버그이며 유형은 null

참조 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null


1
귀하의 참고 자료에는 버그가 없다고 명시되어 있지 않습니다.
user2867288

1
그리고 스펙의 어느 곳에서도 typeof가 "undefined", "object", "boolean", "number", "string", "function"및 "symbol"이외의 값을 반환해야한다고 말하지 않습니다 (ECMAScript 2015)
Brad Kent

1

JavaScript에서 null은 "아무것도 없습니다". 존재하지 않는 것으로 추정됩니다. 불행히도, JavaScript에서 null의 데이터 유형은 객체입니다. JavaScript에서 typeof null이 객체라는 버그로 간주 할 수 있습니다. null이어야합니다.


0

JavaScript에서 typeof null은 'object'이므로 null이 객체임을 잘못 제안합니다. 이것은 버그이며 불행히도 수정할 수없는 버그입니다. 기존 코드를 손상시킬 수 있기 때문입니다.


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