JavaScript における Null と Unknown の深淵を探る
JavaScript のプリミティブ データ型について議論するとき、文字列、数値、ブール値に至るまで、ほとんどの人が知っている基本があります。これらのプリミティブ型は非常に単純で、常識のように動作します。ただし、この記事では、ユニークなプリミティブ データ型である Null と Unknown、およびそれらが非常に似ていながらも矛盾している理由に焦点を当てます。
Null と未定義を理解する
JavaScript では、null はリテラルであり、言語のキーワードであり、認識できないオブジェクトの値を表すために使用されます。つまり「価値がない」という意味で使われます。似ていますが、未定義は実際には値が存在しないことを表します。これらは完全に不変であり、プロパティやメソッドを持たず、プロパティに値を割り当てることもできません。実際、プロパティにアクセスまたは定義しようとすると、TypeError が発生します。名前が示すように、これらは完全に無効な値です。
値なしで表されるブール値は false です。これは、if ステートメントなどの条件付きコンテキストで false と評価されることを意味します。これら 2 つの値を他の false 値と比較するには、等価演算子 (==) を使用します。それらは、それ自体以外は等しくありません。 ; // falseundefine == false; // falsenull == unknown; // true
これやその他の類似点にもかかわらず、null と unknown は同等ではありません。それぞれは独自の型の一意のメンバーであり、unknown は未定義型、null は Null 型です。これら 2 つの値を等価演算子 (===) を使用して比較します。これには、以下に示すように、型と値の両方が等しいことが必要です。さまざまな目的と理由に役立ちます。これら 2 つの値を区別するために、unknown は予期しない値がないことを表し、null は期待される値がないことを表すと考えることができます。
未定義の生成
未定義の値を含むコードを生成する方法はたくさんあります。通常、存在しない値にアクセスしようとしたときに発生します。この場合、JavaScript のような動的で型付けが弱い言語では、エラーが発生するのではなく、デフォルトで未定義の値が返されます。初期値なしで宣言された変数は、デフォルト値が未定義になります: var foo; // デフォルト値は未定義です
存在しないオブジェクトのプロパティまたは配列項目にアクセスしようとすると、未定義の値が返されます:
var array = [1, 2, 3];var foo = array.foo; // foo プロパティが存在しないため、未定義を返します var item = array[5] // 配列内にインデックス 5 の項目がありません。 unknown
関数の return 文が省略された場合は、unknown が返されます:
var value = (function(){})(); // 関数が呼び出されたときに提供されなかった値が返されます。結果は未定義のパラメータ値となります:
void 演算子は未定義の値を返すこともできます。 Underscore のようなライブラリは、これを防御的な型チェックとして使用します。これは、不変であり、どのコンテキストでも unknown を返すことに依存できるためです。グローバル変数 (null キーワードとは異なり) 未定義の値に初期化されます:
ECMAScript 5 では、この変数は読み取り専用ですが、以前はそうではありませんでした。
さらに深く掘り下げる
null と unknown をブラック ホールのようにしているのは、その動作だけではなく、JavaScript 環境内での内部的な処理方法にもあります。多くの場合、それらは他のネイティブ オブジェクトや組み込みオブジェクトと同じ関連特性を持っていないように見えます。 ES5 では、Object.PROtotype.toString メソッドが事実上の型チェック標準となり、null と未定義に対して一貫性があることが証明されています。 Object.prototype.toString.call(null); // [object Null]Object. .toString.call(unknown); // [object Unknown]
ただし、Object.prototype.toString メソッドは、実際には、null の内部 [[Class]] プロパティまたは unknown のパブリック コンストラクターを取得しません。ドキュメントによると、呼び出されたプロセスでは次のステップが発生します:
値が未定義の場合は、「[object Unknown]」を返します。
この値が null の場合は、「[object Null]」を返します。
この値をパラメーターとして渡しながら ToObject を呼び出した結果の値を O とします。
クラスを O の内部プロパティ [[クラス]] の値とします。
返される結果は、「[object」、class、および「]」の 3 つの文字列を連結した結果の文字列値です。
このメソッドは、null または未定義、およびその他のオブジェクト統一関数を検出した場合、単純な文字列の戻り値を実行します。ほとんどのメソッドには単純なキャッチと、null および未定義の値が見つかった場合のリターンが含まれているため、これは仕様全体で共通です。実際、ネイティブ オブジェクトに関連付けられた内部プロパティが含まれているという兆候はありません。まるで物体ではないかのようです。 JavaScript のネイティブ環境内に明示的なソリューションが実際に存在したらどうなるか知りたいです。もしかしたら、実装に詳しい人が参加してくれるかもしれません。
結論
これらのネイティブ オブジェクトがどれほど珍しいものであっても、null と未定義の違い、および JavaScript の言語基盤におけるそれらの異なる役割を理解してください。これによってアプリケーションがブレイクアウトするわけではないかもしれませんが、一般に、開発やデバッグ中に長期的にのみ有益であることが判明します。
上記は JavaScript の Null と Unknown の深淵を探索する内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。