ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript_javascript テクニックにおけるプリミティブ データ型 Null および Unknown の詳細な説明

JavaScript_javascript テクニックにおけるプリミティブ データ型 Null および Unknown の詳細な説明

WBOY
リリース: 2016-05-16 15:25:15
オリジナル
1437 人が閲覧しました

JavaScript のプリミティブ データ型について議論するとき、ほとんどの人は文字列、数値、ブール値までの基本を知っています。これらのプリミティブ型は非常に単純で、常識のように動作します。ただし、この記事では、ユニークなプリミティブ データ型である Null と Unknown、およびそれらが非常に似ていながらも矛盾している理由に焦点を当てます。

1. Null と未定義について理解する
JavaScript では、null は言語のリテラルおよびキーワードであり、認識できないオブジェクト値を表すために使用されます。つまり「価値がない」という意味で使われます。似ていますが、未定義は実際には値が存在しないことを表します。これらは完全に不変であり、プロパティやメソッドを持たず、プロパティに値を割り当てることもできません。実際、プロパティにアクセスまたは定義しようとすると、TypeError が発生します。名前が示すように、これらは完全に無効な値です。

値なしで表されるブール値は false です。これは、if ステートメントなどの条件付きコンテキストで false と評価されることを意味します。等価演算子 (==) を使用して、これら 2 つの値を他の false 値と比較します。それらは、それ自体を除いて等しくありません:

null == 0; // false
undefined == ""; // false
null == false; // false
undefined == false; // false
null == undefined; // true
ログイン後にコピー

ただし、その他の類似点として、null と unknown は同等ではありません。それぞれは独自の型の一意のメンバーであり、unknown は未定義型、null は Null 型です。以下に示すように、型と値の両方が等しい必要がある等価演算子 (===) を使用して、これら 2 つの値を比較します。

undefined === null; // false
ログイン後にコピー
これは、さまざまな目的と理由に役立つ重要な区別です。これら 2 つの値を区別するために、unknown は予期しない値がないことを表し、null は期待される値がないことを表すと考えることができます。


2. 未定義を生成 未定義の値を含むコードを生成するには、さまざまな方法があります。通常、存在しない値にアクセスしようとしたときに発生します。この場合、JavaScript のような動的で型付けが弱い言語では、エラーが発生するのではなく、デフォルトで未定義の値が返されます。
初期値なしで宣言された変数は、デフォルト値が未定義になります:

 var foo; // 默认值为 undefined
ログイン後にコピー
存在しないオブジェクト プロパティまたは配列項目にアクセスしようとすると、未定義の値が返されます:

var array = [1, 2, 3];
var foo = array.foo; // foo 属性不存在, 返回 undefined
var item = array[5]; // 数组中没有索引为5的项,返回 undefined
ログイン後にコピー
関数の return ステートメントが省略された場合、未定義が返されます:

var value = (function(){})(); // 返回 undefined
ログイン後にコピー
関数の呼び出し時に値が指定されていない場合、パラメータ値は未定義になります:

(function(undefined){
  // 参数是 undefined
})();
ログイン後にコピー
void 演算子は未定義の値を返すこともできます。 Underscore のようなライブラリは、これを防御的な型チェックとして使用します。これは、これが不変であり、どのようなコンテキストでも依存して未定義を返すことができるためです:

function isUndefined(obj){
  return obj === void 0;
}
ログイン後にコピー
最後に、未定義は、(null キーワードとは異なり) 未定義の値に初期化された事前定義されたグローバル変数です。

'undefined' in window; // true
ログイン後にコピー
ECMAScript 5 では、この変数は読み取り専用ですが、以前はそうではありませんでした。

3. 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 値を割り当てることにより、参照は実質的にクリアされ、オブジェクトが他のコードによって参照されていないことを前提として、メモリが確実に再利用されるようにガベージ コレクションが指定されます。

4. さらに深く掘り下げる null と unknown をブラック ホールのようにしているのは、その動作だけではなく、JavaScript 環境内での内部的な処理方法にもあります。多くの場合、それらは他のネイティブ オブジェクトや組み込みオブジェクトと同じ関連特性を持っていないように見えます。
ES5 では、Object.prototype.toString メソッドが事実上の型チェック標準となり、null および未定義との一貫性が証明されています。

然而,Object.prototype.toString方法其實並不是檢索null的內部[[Class]]屬性或undefined的公開建構子。根據文檔,以下步驟發生在被調用過程中:

如果值是undefined,則回傳「[object Undefined]」。

  • 如果這個值為null,則回傳「[object Null]」。
  • 讓O作為呼叫ToObject同時傳遞this值作為參數的結果值。
  • 讓class是O的內部屬性[[Class]]的值。
  • 傳回的結果連接三個字串“[object ”,class,和“]”的結果的字串值。

該方法執行一個簡單的字串回傳值,如果它偵測到null或undefined和其他物件統一的功能。在整個規範中這是很常見的,因為當遇到null和undefined值時大多數方法包含一個簡單的捕捉並傳回。事實上,沒有跡象表明他們包含與任何原生物件相關聯的內部屬性。就好像他們不是對象。我很想知道如果一個JavaScript的原生環境內部實際存在的明確方案會怎麼樣?也許有人更熟悉一個可以參與的實現。

結論
無論這些原生物件多麼不尋常,理解null和undefined之間的差異,和他們在JavaScript的語言基礎中截然不同的角色。它可能不能使你的應用程式有所突破,但是一般來說,它僅被證明在開發和調試中長期有益。

以上就是針對javascript中原始資料類型Null和Undefined進行的介紹,希望對大家的學習有所幫助。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート