약간 이상한 점은 JavaScript 언어가 실제로 "비"를 나타내는 두 가지 값, 즉 정의되지 않은 및 null을 가지고 있다는 것입니다. 그 이유는 무엇입니까?
1. 유사성
JavaScript에서는 변수를 정의되지 않거나 무효로 할당하며 정직하게는 거의 차이가 없습니다.
코드 사본은 다음과 같습니다.
var a = 정의되지 않은;
var a = null;
위의 코드에서 변수는 각각 정의되지 않은 및 널에 할당되며,이 두 가지 쓰기 방법은 거의 동일합니다.
정의 및 NULL은 IF 문에서 자동으로 False로 변환되며 평등 연산자는이 둘이 동일하다고 직접보고합니다.
코드 사본은 다음과 같습니다.
if (! undefined)
console.log ( 'undefined is false');
// 정의되지 않은 것은 false입니다
if (! null)
console.log ( 'null은 false');
// null은 false입니다
정의되지 않은 == null
// 진실
위의 코드는이 둘의 동작이 얼마나 유사한 지 보여줍니다!
정의되지 않은 및 null의 의미와 사용이 비슷하기 때문에 왜 그러한 값을 동시에 설정해야합니까? Google에 대한 JavaScript 대안 인 Dart는 NULL만이없고 정의되지 않은 것으로 명확하게 규정하고 있습니다!
2. 역사적 이유
최근에 새 책 "Speak JavaScript"를 읽을 때 실수 로이 질문에 대한 답을 발견했습니다!
이것은 JavaScript의 역사와 관련이 있다는 것이 밝혀졌습니다. JavaScript가 1995 년에 태어 났을 때, 처음에는 Java와 같이 설정되었으며 Null 만 "None"을 나타내는 값으로 설정되었습니다.
C 언어의 전통에 따르면 Null은 자동으로 0으로 전환하도록 설계되었습니다.
코드 사본은 다음과 같습니다.
번호 (null)
// 0
5 + 널
// 5
그러나 JavaScript 디자이너 Brendan Eich는 이것이 두 가지 이유로 충분하지 않다고 생각합니다.
첫째, Null은 Java와 같은 물체로 취급됩니다.
코드 사본은 다음과 같습니다.
널 타입
// "물체"
그러나 JavaScript의 데이터 유형은 원시 및 합성 유형 (복잡한)으로 나뉩니다.
둘째, JavaScript의 초기 버전에는 데이터 유형 불일치가 발생하면 종종 유형을 자동으로 변환하거나 조용히 실패합니다. Brendan Eich는 NULL이 자동으로 0으로 전환되면 오류를 찾기가 쉽지 않다고 생각합니다.
따라서 Brendan Eich는 다른 정의되지 않은 것을 설계했습니다.
3. 초기 디자인
JavaScript의 원래 버전은 다음과 같이 구별되었습니다. Null은 "None"을 나타내는 객체이며, 숫자 값으로 변환 될 때 0은 "None"을 나타내는 원래 값입니다. .
코드 사본은 다음과 같습니다.
번호 (정의되지 않은)
// 난
5 + 정의되지 않았습니다
// 난
4. 현재 사용
그러나, 위의 구별은 실제로 신속하게 입증되지 않았다. 현재 Null과 Undefined는 기본적으로 약간의 차이만으로 동의어입니다.
Null은 "객체 없음"을 의미합니다. 즉, 가치가 없어야합니다. 일반적인 사용은 다음과 같습니다.
(1) 함수의 매개 변수로서 함수의 매개 변수는 객체가 아닙니다.
(2) 객체 프로토 타입 체인의 종말점으로.
코드 사본은 다음과 같습니다.
Object.getPrototype (Object.Prototype)
// 널
정의되지 않은 것은 "결 측값"을 의미하므로 여기에는 값이 있어야하지만 아직 정의되지 않았습니다. 일반적인 사용은 다음과 같습니다.
(1) 변수가 선언되었지만 할당이 없으면 정의되지 않은 것과 같습니다.
(2) 함수를 호출 할 때 제공 해야하는 매개 변수는 제공되지 않으며 매개 변수는 정의되지 않은 것과 같습니다.
(3) 객체는 값에 할당 된 속성이 없으며 속성의 값은 정의되지 않습니다.
(4) 함수가 값을 반환하지 않으면 기본적으로 정의되지 않은 것이 반환됩니다.
코드 사본은 다음과 같습니다.
var i;
I // 정의되지 않았습니다
함수 f (x) {console.log (x)}
f () // 정의되지 않았습니다
var o = new Object ();
op // 정의되지 않았습니다
var x = f ();
x // 정의되지 않았습니다