だから私はここでほとんどの質問を通り抜けてきました。また、かなりの数の記事が良い点と悪い点があります。
私がいくつかの追加の説明を探しているのは、未定義および未宣言の変数がどのように扱われるかです。
以下のコードを取ります。
var a;
if(a == null) // True - Due to Type Coercion
if(a == 'null') // False
if(a === null) // False
if(a === 'null') // False
if(a == undefined) // True
if(a === undefined) // True
if(a == 'undefined') // False
if(a === 'undefined') // False
if(a) // False - A is undefined
alert(typeof(a)) // undefined
上記のすべてを理解しています。しかし、宣言されていない変数を見ると、物事は奇妙になります。特に「varb;」を省略していることに注意してください。
alert(typeof(b)) // undefined
if(typeof(b) == 'undefined') // True
if(typeof(b) === 'undefined') // True - This tells me the function typeof is returning a string value
if(typeof(b) == 'null') // False
if(typeof(b) === 'null') // False
if(typeof(b) == null) // False
if(typeof(b) === null) // False
if(b) // Runtime Error - B is undefined
それ以外の操作を行うと、typeof(b)によってランタイムエラーが発生します。それでも、言語が式を評価する方法の背後にある論理を理解することができます。
だから今私はaの存在しないプロパティを見て、本当に混乱しています。
if(a.c) // Runtime Error - c is null or not an object
alert(typeof(a.c)) // Runtime Error - undefined is null or not an object
この場合のcは、前の例のbのように扱われると思いますが、そうではありません。実際にaを何かに初期化する必要があります。そうすれば、bと同じように動作させることができます。そして、ランタイムエラーをスローしないようにします。
なぜそうなのですか?未定義の型の特別な処理がありますか、それともtypeof関数が実行時エラーをスローしているサブプロパティを評価するために再帰的に何かを実行していますか?
ここでの実際的な質問は、acでネストされたオブジェクトcをチェックしている場合、aが未定義の場合、cは未定義であるとすぐに想定できるということだと思います。
そして、MyObject.Something.Something.Something.xでxのように設定されているかどうかを確認するために、極端にネストされたオブジェクトをチェックしたい場合、最善の方法は何ですか?チェーンの次の構造に進む前に、各要素が存在することを確認して、要素ごとに構造をナビゲートする必要がありますか?