ProgramingTip

"void 0"과 "undefined"의 차이

bestdevel 2020. 12. 7. 20:28
반응형

"void 0"과 "undefined"의 차이


저는 "Closure Compiler"를 사용 하고 있습니다. 펼쳐서 할 때 다음을 사용합니다.

하기 전에 :

// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print,print_input_delimiter
// ==/ClosureCompiler==

var myObj1 = (function() {

  var undefined;   //<----- declare undefined

  this.test = function(value, arg1) {

    var exp = 0;
    arg1 = arg1 == undefined ? true : arg1;  //<----- use declare undefined
    exp = (arg1) ? value * 5 :  value * 10;

    return exp;
  };

  return this;
}).call({});

var myObj2 = (function() {

  this.test = function(value, arg1) {

    var exp = 0;
    arg1 = arg1 == undefined ? true : arg1;  //<----- without declare undefined
    exp = (arg1) ? value * 5 :  value * 10;

    return exp;
  };

  return this;
}).call({});

모두 됨 :

// Input 0
var myObj1 = function() {
  this.test = function(b, a) {
    a = a == void 0 ? true : a;  //<-----
    var c = 0;
    return c = a ? b * 5 : b * 10
  };
  return this
}.call({}), myObj2 = function() {
  this.test = function(b, a) {
    a = a == undefined ? true : a; //<-----
    var c = 0;
    return c = a ? b * 5 : b * 10
  };
  return this
}.call({});

이것으로 나는 "void 0"과 "undefined"의 사용에 대한 질문을 믿습니다. 사용에 어떤 차이가 있습니까?

편집하다

"void 0"으로 정의 된 "var undefined"를 정의하고 "undedined"로 정의 된 "undefined"를 "undefined"와 "void 0"사이의 문자 수는 없습니다.

테스트

편집 II : 성능, 이 링크를 기반으로 함

코드 및 테스트

IE 8 :
typeof : 228ms
정의되지 않음 없음 : 62ms
무효 0 : 57ms

Firefox 3.6 :
typeof : 10ms
정의되지 않음 : 3ms
void 0 : 3ms

Opera 11 :
typeof : 67ms
정의되지 않음 : 19ms
void 0 : 20ms

Chrome 8 :
typeof : 3ms
정의되지 않음 : 5ms
void 0 : 3ms


MDN에서 :

void연산자는 주어진 평가 expression한 후 반환 undefined.

이 연산자를 사용하면 정의되지 않은 것으로 평가되는식이 필요한 위치에 부작용을 생성하는 식을 삽입 할 수 있습니다.

void 연산자는 undefined보통 " void(0)"( " "과 동일)를 사용하여 기본 값 을 얻기 위해 종종 사용됩니다 void 0. 이러한 경우 전역 변수 undefined를 대신 사용할 수 있습니다 (기본값이 아닌 값에 할당되지 않았다고 가정).

폐쇄 컴파일러에 스왑 void 0이보다 적은 문자가 포함되어 있기 때문에 undefined, 따라서 해당하는, 작은 코드를 생산 .


Re : OP 코멘트

예, 설명서를 읽었지만 예제에서 "void 0"과 다른 "undefined"를 사용하는 경우 "google Closure"를 제공했습니다.

나는 이것이 실제로 Google Closure Compiler버그 라고 생각합니다 !


간 실질만을 의미 차이 void exprundefined해당이다 ECMAScript를 (3) 상기 undefined(세계 객체의 속성 window.undefined반면 브라우저 환경에서)는, 기록 가능 void조작자가 반환 undefined값을 항상 .

undefined걱정없이 사용하기 위해 자주 구현되는 인기있는 패턴 은 단순히 인수를 선언하고 아무것도 전달하지 않는 것입니다.

(function (undefined) {
  //...
  if (foo !== undefined) {
    // ...
  }

})();

그러면 minifier가 인수를 단일 문자 ( void 0: 보다 짧더라도)로 축소 할 수 있습니다 . 예 :

(function (a) {
  //...
  if (foo !== a) {
    // ...
  }
})();

이전의 모든 답변에 대한 후속 조치입니다.

그들은 똑같아 보이지만 컴파일러에게는 완전히 다릅니다.

두 코드 섹션은 하나가 지역 변수 (var undefined)를 참조하기 때문에 다른 출력으로 컴파일되고 컴파일러는 정확히 한 번 사용되며 한 줄 이하이므로 단순히 인라인합니다. 두 번 이상 사용하면이 인라이닝이 발생하지 않습니다. 인라인은 "정의되지 않음"의 결과를 제공하며 "무효 0"으로 표시하는 데 더 짧습니다.

지역 변수가없는 것은 클로저 컴파일러 (사실 모든 전역 객체 속성)에 의해 자동으로 "외부"되는 전역 객체 아래의 "정의되지 않음"이라는 변수를 참조 하는 것입니다. 따라서 이름이 변경되지 않고 인라인도 수행되지 않습니다. 짜잔! 여전히 "정의되지 않음".


차이가 없습니다. 직접 시도해보십시오.

void 0 === undefined

로 평가됩니다 true.
undefined이다 3 자 이상, 나는 그들이 그런 식으로 사용하는 이유입니다 같아요.

참고 URL : https://stackoverflow.com/questions/4806286/difference-between-void-0-and-undefined

반응형