nullとundefinedの違いは何ですか?

抜粋:WeChatパブリックアカウント:フロントエンドDaquan

単純な区別

一般 null に、 undefined 両方ともnullを表しますが、主な違いは、 undefined 初期化されていない変数の値を表すことと null 、変数にオブジェクトポインタが意図的にないことです。

  • undefined

    • この変数は基本的に未定義です

    • 隠されたヌル

  • null

    • 値は定義されていますが、メモリ内のオブジェクトを指していません

    • 宣言型null

MDNで与えられた定義

ヌル

値 null はリテラルであり、とは異なり undefined 、グローバルオブジェクトのプロパティではありません。null 変数がオブジェクトを指していないことを示す欠落フラグです。null まだ作成されていないオブジェクトとして理解 する方がよいかもしれません。APIではnull 、戻り型がオブジェクトである必要がある場合によく使用されますが、関連付けられた値はありません。

未定義

undefinedグローバルオブジェクト のプロパティ です 。つまり、グローバルスコープの変数です。undefined の初期値は、プリミティブデータ型 undefined です。

素晴らしい写真

次に、より古典的な写真を見てみましょう。この写真は、stackoverflowの回答からのものです。正確なソースは見つかりませんでした。

 

症状

 彼と 彼null の 違いを理解する前 に、私たちは彼と彼 の  違い をよりよく理解するのを容易にするために、最初に彼の異なる表現が  何で あるかをundefined 知る必要 があります。nullundefinedJSnullundefined

typeof

typeof null  // 'object'
typeof undefined  // 'undefined'

Object.prototype.toString.call

typeof null  // '[object Null]'
typeof undefined  // '[object Undefined]'

==および===

null == undefined  // true
null === undefined  // false
!!null === !!undefined  // true

Object.getPrototypeOf(Object.prototype)

JavaScript の最初のオブジェクトのプロトタイプ null 。

Object.getPrototypeOf(Object.prototype)  // null

+操作とNumber()

let a = undefined + 1  // NaN
let b = null + 1  // 1
Number(undefined)  // NaN
Number(null)  // 0

JSON

JSON.stringify({a: undefined})  // '{}'
JSON.stringify({b: null})  // '{b: null}'
JSON.stringify({a: undefined, b: null})  // '{b: null}'

undefiend ='test'

function test(n) {
    let undefined = 'test'
    return n === undefined
}

test()           // false
test(undefined)  // false
test('test')     // ture

let undefined = 'test'  // Uncaught SyntaxError: Identifier 'undefined' has already been declared

深く探る

typeof nullがオブジェクトであるのはなぜですか?

typeof null 出力は 'object' 実際には低レベルのバグであり、これまで修正することはできません。

その理由は、 JavaScript 初期バージョンでは、値がに 32位 格納されているためです。フロント 3位 はデータ型を示すフラグで、残りのビットは値です。

すべてのオブジェクトで、その前にタイプフラグビットがあり 3位 ます 000 。JavaScript 以前のバージョンで は、これ null は特別な値と見なされ、に対応するために使用されてい C ました 空指针 。ただし、に JavaScript は C ポインタがないため、 null 何も void 意味し ません全0(32个) 。

したがって 、JavaScript 読み取ら れるたびに、null フロントエンド によって3位 処理される 对象类型 ため、が typeof null 返さ れ'object' ます。

Object.prototype.toString.call(null)が'[objectNull]'を出力するのはなぜですか

toString() プロトタイプメソッドです 。Object このメソッドを呼び出すと、デフォルトで現在のオブジェクトが返されます [[Class]] 。 これは、オブジェクトのタイプで[object Xxx] ある フォームの内部プロパティです 。Xxx

JavaScriptのすべてがオブジェクトですが、xxx.toString()が変数の型を返さないのはなぜですか?

これは、各クラスでオーバーライドされ toString たメソッド を呼び出す必要 があり、メソッド Object も  同じ方法で呼び出す必要があるためです。toStringtoString.call()

オブジェクトの場合 Object 、直接呼び出し toString()  はを返し '[object Object]' ます。他のオブジェクトの場合 call / apply 、正しいタイプ情報を返すために呼び出す必要があります。

==と===がtrueとfalseを比較するのはなぜですか?

多くの記事によると、のundefined ブール 値はfalse 、 null のブール値で ある ため false 、比較すると両方とも変換され  ます。実際にはそうではありません。falseundefined == null

ECMA それは 11.9.3 章ではっきりと私たちに教えてくれます:

  1. x が null で、  y が 未定義の場合 、 trueを返し ます

  2. x が 未定義 で、  y が nullの場合 、 trueを返し ます

これが JavaScript 最下位のコンテンツです。より詳細なコンテンツについては、興味があれば JavaScript ソースコードをご覧ください。

なぜ  パフォーマンスとnull + 1 違うの ですか?undefined + 1

これには  、式の変数を実行する前に型に変換しようとする、の JavaScript 暗黙的な型変換が 含まれます 。のような: 結果を取得し ます。加法运算number'1' + 111

  • nullnumber に変換  すると 、に変換されます0

  • undefinednumber に変換  すると 、に変換されますNaN

なぜこのように変換が行われるのかというと、 JavaScript 早い段階で悪いデザインだったと思います。

言語学的観点から: それは未知の値を意味するの
null に対し、明確な無意味なnull値を 意味します。ある  意味で、数値のnullを意味します。これはとてつもないことのように思えるかもしれませんが、この段階で私が考えることができる最高のものです。undefined
0

JSON.stringifyが値が未定義のコンテンツを削除するのはなぜですか?

実際、これについての適切な説明はなく 、対応するキーJSON が undefined 削除されます。これは JSON 、独自の変換原理です。

の場合、 undefined 表現の点で違いがないため、このデータの有無に違いはありません。

let obj1 = { a: undefined }
let obj2 = {}

console.log(obj1.a)  // undefined
console.log(obj2.a)  // undefined

ただし、インターフェイスを呼び出すとき JSON に、フォーマットのデータ undefied に対して特別な処理を実行する必要がある場合があることに注意してください。

undefiend ='test'がJavaScript自体のundefinedをオーバーライドするのはなぜですか?

JavaScript の undefined 制限メソッドは、グローバルの読み取り専用を作成しますが  、ローカル変数の定義をundefined 完全に禁止するわけではありません 。undefined

ハイバージョンではこの操作は禁止されていると JavaScript のことですが、正確な根拠はありません。

 変換が  に変換さ れるundefined 場合でも、変数を上書き しないでください  。この操作も行わないでください。非常に危険な動作になります。JSONundefined''

要約する

undefinedまたはnullの使用について

これは、大衆が合理的であり、母親が合理的であると言っている大衆の物議を醸す内容です。 nullが明示的に定義される方法であるため、
私は使用することを好み ます。null正確な理由はわかりません。

ただし undefined 、使用に関するアドバイスがあります。definenull
を使用する必要がある場合 undefined は、次のいずれも実行しないでください。

  • しましょう;

  • a=未定義とします。

そして、次の方法で明示的に宣言します undefined 。

  • a =void0とします。

おすすめ

転載: blog.csdn.net/qq_41619796/article/details/123093785