とあるライブラリを眺めていて、以下のような関数呼び出しを見つけました。
resetVal(attr, void 0);
void はご存知の方も多いと思いますが、与えられた式を評価して undefined を返す演算子です
通常は内部で undefined 以外の評価結果になるような処理をしつつ、でも結果は undefined
であって欲しい。といったようなケースで使われると思います。
html のアンカータグをクリックしたケースで使われるシーンは昔からよく見かける例です。
でもこの関数呼び出し、以下の書き方じゃダメなのかなと思いました。
resetVal(attr, undefined)
グローバルオブジェクトの undefined プロパティを参照する方法です。
少し調べて以下のことがわかった。
- グローバルオブジェクトの undefined プロパティは ECMAScript3までは書き込み可
- 読み込みのみになったのは ECMAScript5 から
結果以下の可能性が捨てきれない
- グローバルオブジェクトの undefined プロパティが書き換えられていて undefined を返さない可能性がある
- グローバルもしくは関数内で undefined という名前の変数が定義されてグローバルオブジェクトの undefined を参照しない可能性がある
結論
- 確実に undefined を渡したい場合は void 演算子を使うのが安全そう。