ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript における Null と Unknown の深淵を探索する

JavaScript における Null と Unknown の深淵を探索する

黄舟
黄舟オリジナル
2016-12-16 10:15:041220ブラウズ

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(){})(); // 関数が呼び出されたときに提供されなかった値が返されます。結果は未定義のパラメータ値となります:

(function(unknown){ // パラメータは未定義です})();

void 演算子は未定義の値を返すこともできます。 Underscore のようなライブラリは、これを防御的な型チェックとして使用します。これは、不変であり、どのコンテキストでも unknown を返すことに依存できるためです。グローバル変数 (null キーワードとは異なり) 未定義の値に初期化されます:

'unknown' in window; // true

ECMAScript 5 では、この変数は読み取り専用ですが、以前はそうではありませんでした。

Null の使用例

null の使用例は、null が異なる主な側面です。これは、未定義とは異なり、null はより有用であると考えられているためです。 typeof 演算子が null 値に適用されると「object」を返すのはこのためです。元の理論的根拠は、プレースホルダーと同様に、null オブジェクトが予期されるため、null 参照が通常使用されるというものであり、現在でもそうです。 typeof のこの動作はバグとして確認されており、修正が提案されましたが、下位互換性のために変更されていません。このため、JavaScript 環境では値を null に設定することはなく、プログラムで行う必要があります。ドキュメント MDN に記載されているように、API では、オブジェクトが取得される場所で null が予期されることがよくありますが、関連するオブジェクトはありません。これは、言語に依存せず、ECMAScript 仕様の範囲外である DOM に適用されます。これは外部 API であるため、存在しない要素を取得しようとすると、未定義ではなく null 値が返されます。一般に、不変の値を変数またはプロパティに割り当てる必要がある場合、それを関数に渡す必要がある場合、または関数から null を返す必要がある場合は、ほとんどの場合、null が最良の選択です。要するに、JavaScript は unfineed を使用し、プログラマは null を使用する必要があります。 null のもう 1 つの使用例は、参照が必要なくなったときに、変数を無効 (object= null) として明示的に指定することです。 Null 値を割り当てることにより、参照は実質的にクリアされ、オブジェクトが他のコードによって参照されていないことを前提として、メモリが確実に再利用されるようにガベージ コレクションが指定されます。


さらに深く掘り下げる

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) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。