抜粋:WeChatパブリックアカウント:フロントエンドDaquan
単純な区別
一般 null
に、 undefined
両方ともnullを表しますが、主な違いは、 undefined
初期化されていない変数の値を表すことと null
、変数にオブジェクトポインタが意図的にないことです。
-
undefined
-
この変数は基本的に未定義です
-
隠されたヌル
-
-
null
-
値は定義されていますが、メモリ内のオブジェクトを指していません
-
宣言型null
-
MDNで与えられた定義
ヌル
値 null
はリテラルであり、とは異なり undefined
、グローバルオブジェクトのプロパティではありません。null
変数がオブジェクトを指していないことを示す欠落フラグです。null
まだ作成されていないオブジェクトとして理解 する方がよいかもしれません。APIではnull
、戻り型がオブジェクトである必要がある場合によく使用されますが、関連付けられた値はありません。
未定義
undefined
グローバルオブジェクト のプロパティ です 。つまり、グローバルスコープの変数です。undefined
の初期値は、プリミティブデータ型 undefined
です。
素晴らしい写真
次に、より古典的な写真を見てみましょう。この写真は、stackoverflowの回答からのものです。正確なソースは見つかりませんでした。
症状
彼と 彼null
の 違いを理解する前 に、私たちは彼と彼 の 違い をよりよく理解するのを容易にするために、最初に彼の異なる表現が 何で あるかをundefined
知る必要 があります。null
undefined
JS
null
undefined
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
も 同じ方法で呼び出す必要があるためです。toString
toString.call()
オブジェクトの場合 Object
、直接呼び出し toString()
はを返し '[object Object]'
ます。他のオブジェクトの場合 call / apply
、正しいタイプ情報を返すために呼び出す必要があります。
==と===がtrueとfalseを比較するのはなぜですか?
多くの記事によると、のundefined
ブール 値はfalse
、 null
のブール値で ある ため false
、比較すると両方とも変換され ます。実際にはそうではありません。false
undefined == null
ECMA
それは 11.9.3
章ではっきりと私たちに教えてくれます:
x が null で、 y が 未定義の場合 、 trueを返し ます。
x が 未定義 で、 y が nullの場合 、 trueを返し ます。
これが JavaScript
最下位のコンテンツです。より詳細なコンテンツについては、興味があれば JavaScript
ソースコードをご覧ください。
なぜ パフォーマンスとnull + 1
違うの ですか?undefined + 1
これには 、式の変数を実行する前に型に変換しようとする、の JavaScript
暗黙的な型変換が 含まれます 。のような: 結果を取得し ます。加法运算
number
'1' + 1
11
-
null
number
に変換 すると 、に変換されます0
-
undefined
number
に変換 すると 、に変換されます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
場合でも、変数を上書き しないでください 。この操作も行わないでください。非常に危険な動作になります。JSON
undefined
''
要約する
undefinedまたはnullの使用について
これは、大衆が合理的であり、母親が合理的であると言っている大衆の物議を醸す内容です。 nullが明示的に定義される方法であるため、
私は使用することを好み ます。null
正確な理由はわかりません。
ただし undefined
、使用に関するアドバイスがあります。definenull
を使用する必要がある場合 undefined
は、次のいずれも実行しないでください。
-
しましょう;
-
a=未定義とします。
そして、次の方法で明示的に宣言します undefined
。
-
a =void0とします。