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.