未定義の値と未定義の型の違い、および同様に null 値と Null 型の違いを誰かが説明してくれますか?
おまけ: boolean、string、number には値、型、オブジェクトがあり、null と undefined は値と型しかない (オブジェクトがない) のはなぜですか? 「すべてがオブジェクトである」場合、使用可能なすべての値のオブジェクトがあると想定されますよね? Infinity オブジェクトと NaN オブジェクトはどこにありますか?
未定義の値と未定義の型の違い、および同様に null 値と Null 型の違いを誰かが説明してくれますか?
おまけ: boolean、string、number には値、型、オブジェクトがあり、null と undefined は値と型しかない (オブジェクトがない) のはなぜですか? 「すべてがオブジェクトである」場合、使用可能なすべての値のオブジェクトがあると想定されますよね? Infinity オブジェクトと NaN オブジェクトはどこにありますか?
null
とundefined
は値です。偶然にも (または単なる賢明な選択)、それらの型は、仕様で定義されているように、null
それぞれvalue / type、value / typeです。これは、演算子を使用して表示することもできます。undefined
null
undefined
typeof
typeof undefined; // "undefined"
typeof null ; // "null" (in ES6) and "object" in <=ES5 (bug)
値は、値の「種類」を示す型に関連付けられています。
「値と型の違いは何ですか?」という質問に答えるには :
型はある種のカテゴリであり、値はそのカテゴリの具体的なインスタンスであると考えてください。
たとえば、タイプがString
あり、具体的な値は になります"foo"
。type にはさまざまな値が存在する可能性がありますが、との型に使用String
できる値は 1 つだけで、それぞれとです。Null
Undefined
null
undefined
仕様のセクション 4.3が最も役立つ IMO です。ここでは、文字列に関する情報や、値、型、オブジェクトの違いなどを確認できます。
4.3.16 文字列値0 個以上の 16 ビット符号なし整数の有限順序シーケンスである
プリミティブ値。注: 文字列値は、文字列型のメンバーです。シーケンス内の各整数値は、通常、UTF-16 テキストの単一の 16 ビット単位を表します。ただし、ECMAScript では、値が 16 ビットの符号なし整数でなければならないことを除いて、値に制限や要件はありません。
4.3.17 文字列型すべての可能な文字列値の
セット。4.3.18標準組み込みコンストラクターのインスタンスで
ある Object 型の文字列オブジェクト メンバー。String
注: String オブジェクトは
String
、引数として String 値を指定して、新しい式でコンストラクタを使用して作成されます。結果のオブジェクトには、値が文字列値である内部プロパティがあります。String コンストラクターを関数として呼び出すことにより、String オブジェクトを強制的に String 値にすることができます (15.5.1)。
null
とに似てundefined
いますが、同等のオブジェクトはありません。なんで?そのためには、その言語を定義している人に尋ねる必要があります;)
「すべてがオブジェクトである」場合、使用可能なすべての値のオブジェクトがあると想定されますよね?
より正確なステートメントは、「ほぼすべてがオブジェクトである」です。プリミティブ値は明らかにオブジェクトではありませんが、それらのほとんどには同等のオブジェクト (実際には使用されるべきではありません) があり、他の値については気にしません。実際、JavaScript は主にオブジェクト指向です。
Infinity オブジェクトと NaN オブジェクトはどこにありますか?
Infinity
とNaN
はtype の値なので、次のようにオブジェクトをNumber
作成できます。Number
new Number(1/0) // Infinity
new Number("a") // NaN
Number
とにかく、オブジェクトを使用することはめったにありません。
typeof null === "object"
それを除外するだけです。null
オブジェクトとして扱われます。ECMAscript のすべてがオブジェクトというわけではありません。「反対側」は、いわゆる「プリミティブ値」です。プリミティブ値は、簡単に言えば、どのObject コンストラクターによっても作成されなかったプレーンな値です。例えば:
var prim = 23;
prim.foo = true;
console.log( 'prim is: ', prim, 'prim.foo is: ', prim.foo ); // "prim is 23, prim.foo is: undefined"
一方で
var prim = new Number(23);
prim.foo = true;
console.log( 'prim is: ', +prim, 'prim.foo is: ', prim.foo ); // "prim is 23, prim.foo is: true"
prim
プラス演算子を使用して、2 番目のスニペットで明示的にキャストしていることに注意してください。そのような「プリミティブ値」を操作する 2 番目に、ECMAscript (より正確には、そのエンジン) はその値を内部的にオブジェクト表現に変換します。つまり、「すべてがオブジェクトである」という指摘は、実際にはほとんど正しかったということです。
undefined
定義された値です(ばかげているように聞こえますが):
'undefined' in window // true
一方null
、言語の一部にすぎない型です。