> nullが設定されない限り変数はnullにはならない
その通りですね。良い例が思い浮かばなかったのですが,
var node = document.createElement ('table');
// HTMLTableElement は,tHead プロパティを持つが,初期値は null
typeof node.tHead; // 'object'(typeof null は 'object' を返す)
// スペルミスしてしまった! thead というプロパティは存在しない
typeof node.thead; // 'undefined'
のように,本来のプロパティ(null)かそうでないか(undefined)をチェックすることもできます(特に DOM 関連のプロパティは,accessKey とか rowSpan とか htmlFor とか,うっかりミスしやすいものが多いので)。
> 以下のソースに問題を感じますでしょうか?
>>2 のコードだと,
doesExist ('Array.xyzxyz'); // 存在しないプロパティだが true
になってしまいますが,これは構わないのでしょうか。
----------
本題から少し離れますが,私自身これまで「プロパティ」「変数」を曖昧に使っていた(すみません m(_ _)m)ので,いったん整理させて下さい。
JavaScript では以下を区別する必要があります(括弧内の数字は ECMA 262-3 の節番号)。
* A. プロパティ prop の探索(プロトタイプチェーン)
obj.prop → C1.prototype.prop → C2.prototype.prop → …… → Object.prototype.prop
ここまで探索して見つからなければ undefined を返します(§8.6.2.1)。
なお,obj.prop.prop2 が undefined.prop2 となった場合,例外 TypeError を投げます(§11.2.1,9.9)。
* B. 変数 variable の探索(スコープチェーン)
func1.variable → func2.variable → func3.variable → …… → Global.variable
ここで,func1,func2 は,その関数を実行する不可視のオブジェクト(Activation オブジェクト)ですが,とりあえず今は「variable の宣言が func1 内に見つからなければ,より上位の func2,func3,……最終的に Global まで文脈をさかのぼって variable を探す」ということで,お茶を濁します。
Global まで探索しても見つからなければ null.variable を返します(§10.1.4)。null.variable を参照しようとすると例外 ReferenceError が発生します(§8.7.1)。null.variable を設定しようとすると Global.variable を作成します(§8.7.2)。
なお,ブラウザ上では,Global は window になります。つまり,グローバルな変数・関数は,ブラウザ上では window のプロパティ・メソッドとなります。