undefinedの代わりにvoid 0を使います.

1990 ワード

いくつかのフレームのソースコードを読んでいると、undefinedの代わりにvoid 0を使っています.簡単なGoogleです.
void演算子
void演算子は、与えられた表現を求めてundefinedを返します.
void 0; // undefined
void ('0'); // undefined
void "hello world"; // undefined
void function (){return 'foo'}() // undefined
undefined
私たちはよく次のように判断します.
if (foo === undefined) {
  foo = 'foo'
}
厳密にはこのようなコードは安全ではありません.デフォルトではundefinedの値は変更されていません.undefinedはJavaScriptの予約ワードではないので、グローバル変数上の属性の一つです.属性値は元の値undefinedです.ECMAScript 5の前に、window.undefinedに値を割り当てると、この属性が上書きされます.ECMAScript 5からundefinedは配置されず、書き換えられない属性です.
Object.getOwnPropertyDescriptor(window, 'undefined');
/* {
  value: undefined, 
  writable: false, 
  enumerable: false, 
  configurable: false
} */
しかし、undefinedは予約されていないため、依然としてローカルスコープでundefinedの変数を宣言し、その値を変更することができます.
function foo () {
  let undefined = 'hello world';
 
  return function (v) {
    return v === undefined;
  }
}

let isUndefined = foo();
let bar;
isUndefined(bar); // false
isUndefined(undefined); // false
isUndefined('hello world'); // true
安全な書き方
一つは、typeofで、元の値undefinedに対して、typeofは常に文字列'undefined'を返します.
function foo () {
  let undefined = 'hello world';
 
  return function (v) {
    return typeof v === 'undefined';
  }
}
let isUndefined = foo();
let bar;
isUndefined(bar); // true
isUndefined(undefined); // true
isUndefined('hello world'); // false
もう一つはvoid演算子で、void演算子は常に元の値undefinedに戻ります.
function foo () {
  let undefined = 'hello world';
 
  return function (v) {
    return v === void 0;
  }
}
let isUndefined = foo();
let bar;
isUndefined(bar); // true
isUndefined(undefined); // true
isUndefined('hello world'); // false
もちろん、void'hello world'と比較してもいいですが、void 0の文字数はもっと短くて、typeofより書くのが便利です.フレームコードは自分の実行文脈を知らないので、undefinedタグが再割り当てされたかどうかは仮定できないので、void 0で元の値かどうかを判断します.