>  기사  >  웹 프론트엔드  >  JavaScript_javascript 팁의 Null 및 정의되지 않은 구문 분석

JavaScript_javascript 팁의 Null 및 정의되지 않은 구문 분석

WBOY
WBOY원래의
2016-05-16 17:54:181013검색

JavaScript 개발 중에 다음과 같은 질문을 받았습니다. null과 정의되지 않은 것의 차이점은 무엇입니까?

특히 undefound의 구현 원칙이 포함되어 있기 때문에 현재로서는 답변하기 어렵습니다. 그래서 곰곰이 생각한 끝에 이 글을 쓰게 되었고 여러분께 도움을 요청하게 되었습니다.

우리 모두 알고 있듯이: null == 정의되지 않음

하지만: null !== 정의되지 않음

그럼 둘의 차이점은 무엇인가요?

제 말투를 잘 들어주세요...

객체이지만 비어 있습니다. 객체이기 때문에 typeof null 은 'object' 를 반환합니다.

null은 JavaScript 예약 키워드입니다.

null이 수치 연산에 참여하면 그 값은 자동으로 0으로 변환됩니다. 따라서 계산 후 다음 표현식은 올바른 값을 얻습니다.

표현식: 123 null 결과 값: 123

표현식: 123 * null 결과 값: 0

정의되지 않음

정의되지 않음은 전역 개체(창)의 특수 속성이며 해당 값은 정의되지 않습니다. 그러나 typeof undefound 는 'undefine' 을 반환합니다.

정의되지 않음은 특별한 의미를 가지고 있지만 실제로는 속성이며 전역 개체(창)의 속성입니다. 아래 코드를 살펴보세요.

alert(창에서 '정의되지 않음'); //출력: true
alert(창에서 정의되지 않음); //출력: true
var anObj =
alert('정의되지 않음') anObj); //출력: false

이를 보면 undefound는 window 객체의 속성이지만 anObj 객체의 속성은 아니라는 것을 알 수 있습니다.

참고: 정의되지 않음은 특별한 의미를 갖는 속성이지만 JavaScript에서는 예약어가 아닙니다.

정의되지 않음이 수치 계산에 참여하는 경우 결과는 NaN이어야 합니다.

그런데 NaN은 전역 개체(창)의 또 다른 특수 속성이며 Infinity도 마찬가지입니다. 이러한 특수 속성 중 어느 것도 JavaScript용으로 예약된 키워드가 아닙니다!

정의되지 않은 성능 개선

프로그램에서 정의되지 않은 값을 사용하면 실제로는 window 개체의 정의되지 않은 속성을 사용하는 것입니다.

마찬가지로 변수를 정의했지만 초기 값을 할당하지 않은 경우, 예를 들면 다음과 같습니다.

var aValue;

이때 JavaScript는 소위 사전 컴파일(precompilation) 중에 window.undefine 속성에 대한 참조로 초기값을 설정합니다.

따라서 변수나 값을 정의되지 않음과 비교할 때 실제로는 창 개체의 정의되지 않은 속성과 비교됩니다. 이 비교 과정에서 JavaScript는 window 개체의 'undefine'이라는 속성을 검색한 다음 두 피연산자의 참조 포인터가 동일한지 비교합니다.

윈도우 객체는 속성값이 많기 때문에 undefine과 비교할 때마다 윈도우 객체의 undefound 속성을 검색하는데 시간이 걸립니다. 이는 정의되지 않은 항목과 자주 비교해야 하는 함수에서 성능 문제가 될 수 있습니다. 따라서 이 경우에는 정의되지 않은 로컬 변수를 직접 정의하여 정의되지 않은 비교 속도를 높일 수 있습니다. 예:

function anyFunc()
{
var undefine; //사용자 정의된 로컬 정의되지 않은 변수

if(x == undefine) //범위에 대한 참조 비교

while( y != 정의되지 않음) //범위에 대한 참조 비교

};

그 중 정의되지 않은 지역변수를 정의할 때 초기값은 window.undefine 속성값에 대한 참조가 됩니다. 새로 정의된 지역 변수가 정의되지 않은 함수 범위에 존재합니다. 이후 비교 작업에서는 자바스크립트 코드를 작성하는 방식에는 변화가 없지만 비교 속도는 매우 빠르다. 범위 내의 변수 개수는 창 개체의 속성보다 훨씬 적기 때문에 변수 검색 속도가 크게 향상됩니다.

이것이 바로 많은 프런트엔드 JS 프레임워크가 종종 정의되지 않은 로컬 변수 자체를 정의하는 이유입니다!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.