[javascript] JavaScript에 ‘null’값이있는 이유는 무엇입니까?
JavaScript에는 기본적으로 ‘I do n’t exist’ undefined
와 null
.
프로그래머가 아무것도 할 것이다 할당되지 않은에 속성 undefined
이 될 수있는 속성에 대해,하지만 순서는 null
, null
명시 적으로 할당해야합니다.
나는 한때 원시적 가치와 객체 null
이기 때문에 필요가 있다고 생각했습니다 . 양보 하지 않습니다 . 사실 둘 다 원시 값입니다. 즉 , 둘 다 빈 객체로 변환되므로 생성자 함수에서 반환 할 수도 없고 반환 할 수도 없습니다 (생성자에서 실패를 선언하려면 오류를 발생시켜야합니다).undefined
null
typeof null
'object'
undefined
null
또한 둘 다 false
부울 컨텍스트에서 평가 됩니다. 내가 생각할 수있는 유일한 차이점은 하나는으로 평가되고 NaN
다른 하나 0
는 숫자 컨텍스트에서 평가된다는 것입니다 .
그렇다면 왜 둘 다 undefined
있고 null
이것이 null
속성이 설정되었는지 여부를 찾으려고 할 때 잘못 확인하는 프로그래머를 혼란스럽게한다면 ?
내가 알고 싶은 것은 누군가 대신 null
사용하여 표현할 수없는 사용 이 필요한 합리적인 예가 있는지 여부 undefined
입니다.
그래서 일반적인 합의는 undefined
‘그런 재산이 없다 null
‘는 의미 이고 ‘재산이 존재하지만 가치 가 없다’는 의미 인 것 같습니다 .
자바 스크립트 구현이 실제로이 동작을 강제 할 수 있다면 그와 함께 살 수 있습니다. 그러나 undefined
완벽하게 유효한 기본 값이므로 기존 속성에 쉽게 할당하여이 계약을 위반할 수 있습니다. 따라서 속성이 있는지 확인하려면 in
연산자 를 사용해야 hasOwnProperty()
합니다. 다시 한 번 : undefined
및에 대한 별도의 값에 대한 실제 사용은 null
무엇입니까?
undefined
더 이상 사용하지 않지만 원하지 않는 속성 값을 설정 해제하고 싶을 때 실제로 사용 합니다 delete
. null
대신 사용해야합니까 ?
답변
질문은 실제로 “JS에 null 값이있는 이유”가 아닙니다. 대부분의 언어에는 일종의 null 값이 있으며 일반적으로 매우 유용한 것으로 간주됩니다.
질문은 ” JS에 정의되지 않은 값 이있는 이유 “입니다. 사용되는 주요 장소 :
- 선언
var x;
했지만 할당하지 않으면x
정의되지 않은 상태로 유지됩니다. - 함수가 선언 한 것보다 적은 인수를받을 때;
- 존재하지 않는 개체 속성에 액세스 할 때.
null
확실히 (1)과 (2) *에 대해 잘 작동했을 것입니다. (3) 실제로 예외를 즉시 던져야하며, undefined
나중에 실패 할 이상한 것을 반환하는 대신에 예외를 반환하지 않는다는 사실 은 디버깅 어려움의 큰 원인입니다.
* : (2) 예외가 발생해야한다고 주장 할 수도 있지만 기본 / 변수 인수에 대해 더 명확하고 더 명확한 메커니즘을 제공해야합니다.
그러나 JavaScript에는 원래 예외가 없었거나 특정 이름의 멤버가 있는지 객체에 요청하는 방법이 없었습니다. 유일한 방법은 멤버에 액세스하고 얻을 수있는 내용을 보는 것뿐이었습니다. 점을 감안 null
이미 목적을 가지고 당신이 잘하는 멤버가 다른 대역 값이 필요했다을 설정할 수 있습니다. 그래서 우리는 undefined
당신이 지적한 것처럼 문제 가 있으며 , 우리가 결코 제거 할 수없는 또 다른 훌륭한 자바 스크립트 ‘기능’입니다.
더 이상 사용하지 않지만 삭제하고 싶지 않은 속성 값을 설정 해제하고 싶을 때 실제로 undefined를 사용합니다. 대신 null을 사용해야합니까?
예. undefined
다른 언어에서 예외가 발생할 수있는 경우 신호를 보내는 특수 값으로 유지하십시오 .
null
를 설정 null
하면 오류가 발생할 수 있는 일부 IE DOM 인터페이스를 제외하고는 일반적으로 더 좋습니다 . 종종이 경우 빈 문자열로 설정하면 작동하는 경향이 있습니다.
답변
여기에 가장 잘 설명 되어 있지만 요약하면 다음과 같습니다.
undefined는 유형과 값이없는 것이고 null은 값이없는 것입니다.
또한 간단한 ‘==’비교를 수행하면 맞습니다. 그러나 유형과 값을 모두 비교하는 ===를 시도하면 차이를 알 수 있습니다.
답변
나는 모두를 할 이유가 없다고 생각 null
하고 undefined
유일한 이유는 많은 사람들이 제안했기 때문에 ( ” undefined
자바 스크립트 적어도하지 유효 그런 변수 / 속성이 없다 수단”). undefined
변수 / 속성이 존재하는지 여부를 말할 수 없습니다.
console.log(foo); // "ReferenceError: foo is not defined"
// foo does not exist
var foo;
console.log(foo); // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist
var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined); // "true", but it does exist
obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted
보시다시피 확인 foo === undefined
은 foo
존재 여부를 알려주지 obj.bar = undefined
않으며 설정 은 실제로 bar
.
undefined
“존재하지 않음”을 나타내는 것은 JavaScript 작성자의 원래 의도 일 수 있습니다 . 그러나 구현은 그렇게되지 않았습니다.
답변
둘 다 필요로하는 것은 전적으로 가능합니다. 예를 들어 WMI를 쿼리하는 경우 null 값이있는 클래스 반환 속성을 가질 수 있습니다. 그들은 정의되어 있으며, 당시에 null을 유지합니다.
답변
나는 자바 스크립트 undefined
가 “그런 속성이 없다”고 null
“속성이 가치가 없다 “고 정의한다는 당신의 결론 은 완벽하게 옳다고 생각합니다. 그리고 JavaScript와 같은 동적 언어에서는 매우 중요한 차이입니다. 덕 타이핑을 사용한다는 것은 존재하지 않는 속성과 값이없는 속성을 구별 할 수 있어야 함을 의미합니다. 유형 정보를 파생하는 기본 수단입니다. 정적으로 형식화 된 언어에서는 필드가 null 인 필드와 존재하지 않는 필드가 분명하게 구분됩니다. JavaScript에서 이것은 다르지 않습니다. 그러나 런타임시 확인되며 그 때까지 수정할 수 있습니다.
많은 시간이 흐려지면서 구현이 이상하다는 데 동의해야 할 것입니다. 그러나 JavaScript에서는 구별이 중요하다고 생각합니다. 그리고 할당 할 수 있어야합니다 undefined
.
얼마 전에 JavaScript로 작성된 온라인 RPG에 대한 블로그 게시물을 읽은 기억이 있습니다. 개체가 프로토 타입 (클래스, 함수 등)이 아닌 기존 인스턴스의 복사본으로 생성 된 다음 변경된 예제를 사용했습니다. 이로 인해 undefined
기존 개체를 수정할 때 얼마나 강력한 지 이해하게 되었지만 누가 작성했는지 기억할 수 없습니다.
답변
의미 적으로 그들은 다른 것을 의미합니다. null 유형은 도메인에 정확히 하나의 값을 가지며 null 및 속성에이 특정 값이 할당 될 수 있습니다. 정의되지 않음은 할당 된 값의 뚜렷한 부족을 나타냅니다.
답변
Java 프로그래머로서 저는 undefined와 null의 큰 차이를 봅니다. JavaScript는 강력한 유형이 아니기 때문에 JavaScript 코딩은 그리 많지 않으며, undefined와 null의 차이는 런타임에서 자주 수행되는 자동 변환으로 인해 희미 해집니다. BTW, 저는 이러한 변환을 자주 활용합니다. 그들은 내 JS 코드를 더 간결하고 읽기 쉽게 만듭니다.
질문에 대답하기 위해 정의되지 않음은 값이 설정되지 않았 음을 의미합니다. 실제로 이것은 일반적으로 버그를 가리 킵니다. yourObject.property가 정의되지 않은 경우 어떤 이유로 든 속성을 설정하지 않았거나 전혀 존재하지 않는 것을 찾고 있다는 의미입니다. 이것은 둘 이상의 코더가있는 프로젝트에서 작업 할 때 실제 문제입니다.
null은 “값 없음”이 명시 적으로 설정되었음을 의미합니다. 실질적으로 말해서, 당신은 속성에 대해 뭔가를 말하고 있습니다. 아마도이 상황에서 사용되지 않았거나 값이 아직 결정되지 않았을 것입니다.
Java에서 정의되지 않은 필드에 액세스하려고하면 항상 예외가 발생합니다. 실제로 컴파일러는 코드에서 이에 대해 경고하도록 만들 수 있습니다.