>  기사  >  웹 프론트엔드  >  저한테서 자바스크립트의 정의되지 않은 기술과 null_javascript 기술을 배워보세요

저한테서 자바스크립트의 정의되지 않은 기술과 null_javascript 기술을 배워보세요

WBOY
WBOY원래의
2016-05-16 15:31:521369검색

JavaScript의 기본 데이터 유형을 논의할 때 대부분의 사람들은 문자열에서 숫자, 부울에 이르는 기본 사항을 알고 있습니다. 이러한 기본 유형은 매우 단순하며 상식처럼 작동합니다. 그러나 이 기사에서는 고유한 기본 데이터 유형인 Null 및 Undefine과 이 유형을 유사하면서도 역설적으로 만드는 이유에 대해 더 중점을 둘 것입니다.

1. null과 정의되지 않음을 이해합니다

JavaScript에서 null은 인식할 수 없는 개체 값을 나타내는 데 사용되는 리터럴이자 언어의 키워드입니다. 즉, "값이 없음"을 의미하는 데 사용되지만, 기대값을 언제 얻을지 결정할 수 있습니다.

비슷하지만 정의되지 않음은 실제로 값이 존재하지 않음을 나타내며, 이는 뭔가 누락되었음을 의미합니다. 둘 다 완전히 불변이고 속성과 메서드가 없으며 해당 속성에 값을 할당할 수 없습니다. 실제로 null이거나 정의되지 않은 속성에 액세스하거나 정의하려고 하면 TypeError가 발생합니다.

값 없음으로 표시되는 부울 값은 false입니다. 즉, if 문과 같은 조건부 컨텍스트에서 false로 평가됩니다. 이 두 값을 다른 false 값과 비교하려면 같음 연산자(==)를 사용하세요. 두 값은 그 자체를 제외하고는 같지 않습니다.

null == 0; // false 
undefined == ""; // false 
null == false; // false 
undefined == false; // false 
null == undefined; // true 

그러나 다른 유사점인 null과 undefine은 동일하지 않습니다. 각각은 고유한 유형의 고유한 멤버이고, undefed는 Undefine 유형이고 null은 Object 유형입니다. 아래와 같이 유형과 값이 모두 동일해야 하는 같음 연산자(===)를 사용하여 이 두 값을 비교합니다.

null === undefined; //false
typeof null; //"object"
typeof undefined; //"undefined"

위 설명: null 객체이지만 비어 있습니다. null은 JavaScript 예약 키워드입니다.
또한, Null이 수치연산에 참여할 경우 해당 값은 자동으로 0으로 변환됩니다. 따라서 계산 후 다음 수식을 사용하면 올바른 값을 얻을 수 있습니다.

123 + null;   //123 
123 * null;   //0 

정의되지 않음은 전역 개체(창)의 특수 속성이며 해당 값은 정의되지 않습니다. 그러나 typeof undefound 는 'undefine' 을 반환합니다.
정의되지 않음은 특별한 의미를 가지고 있지만 실제로는 속성이며 전역 개체(창)의 속성입니다. 아래 코드를 살펴보세요.

alert('undefined' in window);//输出:true 
var anObj = {}; 
alert('undefined' in anObj); //输出:false 

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

  • 정의되지 않음은 특별한 의미를 갖는 속성이지만 JavaScript에서는 예약어가 아닙니다. undefound가 수치 계산에 참여하는 경우 결과는 NaN이어야 합니다. 그런데 NaN은 전역 개체(창)의 또 다른 특수 속성이며 Infinity도 마찬가지입니다. 이러한 특수 속성 중 어느 것도 JavaScript용으로 예약된 키워드가 아닙니다!
  • 값이나 개체가 null인지 확인할 때는 "==="를 사용하여 확인해야 합니다. "=="만 사용하면 null인지 정의되지 않은지 확인할 수 없습니다.

2. 정의되지 않은 상황이 발생합니다
정의되지 않은 값으로 코드를 생성하는 방법에는 여러 가지가 있습니다. 일반적으로 존재하지 않는 값에 액세스하려고 할 때 발생합니다. 이 경우 JavaScript와 같은 동적이고 약한 유형의 언어에서는 오류가 발생하는 대신 기본적으로 정의되지 않은 값이 반환됩니다.

1. 초기 값 없이 선언된 모든 변수의 기본값은 정의되지 않음입니다.

var foo; // 默认值为 undefined 

2. 존재하지 않는 객체 속성이나 배열 항목에 액세스하려고 하면 정의되지 않은 값이 반환됩니다.

var array = [1, 2, 3]; 
var foo = array.foo; // foo 属性不存在, 返回 undefined 
var item = array[5]; // 数组中没有索引为5的项,返回 undefined 

3. 함수의 return 문이 생략되거나 return 문이 매개 변수를 사용하지 않고 정의되지 않은 상태를 반환하는 경우:

var value = (function(){

})(); // 返回 undefined 
var value1 = (function(){
  return;
})(); // 返回 undefined 

4. 함수 호출 시 제공해야 할 매개변수가 제공되지 않고, 매개변수가 정의되지 않음

function f(x){
  console.log(x)
}
f(); // undefined

마지막으로 undefine은 (null 키워드와 달리) 정의되지 않은 값으로 초기화된 미리 정의된 전역 변수입니다.

'undefined' in window; // true 

ECMAScript 5中,这个变量是只读的,以前并非如此。

三、null的用例

null的用例是使他与众不同的主要方面,因为不像undefined,null被认为是更有用。这正是为什么typeof操作符作用于null值 时返回“object”。最初的理由是,现在仍然是,通常用作一个空引用一个空对象的预期,就像一个占位符。typeof的这种行为已经被确认为一个错 误,虽然提出了修正,出于后兼容的目的,这一点已经保持不变。

一般来说,如果你需要给一个变量或属性指定一个不变值,将它传递给一个函数,或者从一个函数返回null,null几乎总是最好的选择。简而言之,JavaScript使用undefined并且程序员应该使用null。

null的另一个可行的用例,也被认为是良好的实践是一个显式指定变量为无效(object= null)当一个引用不再是必需的。通过分配null值,有效地清除引用,并假设对象没有引用其他代码,指定垃圾收集,确保回收内存。

四、提高undefined性能

当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。 同样,当我们定义一个变量但未赋予其初始值,例如:

var aValue; 

这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用, 于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同。

由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:

function anyFunc() { 
  var undefined; 
  //自定义局部undefined变量 
  if(x == undefined) 
  //作用域上的引用比较 
  while(y != undefined) 
  //作用域上的引用比较 
}; 

其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变 量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。

这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!

以上就是本文的全部内容,希望对大家的学习有所帮助。

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