3

未定義の値と未定義の型の違い、および同様に null 値と Null 型の違いを誰かが説明してくれますか?

おまけ: boolean、string、number には値、型、オブジェクトがあり、null と undefined は値と型しかない (オブジェクトがない) のはなぜですか? 「すべてがオブジェクトである」場合、使用可能なすべての値のオブジェクトがあると想定されますよね? Infinity オブジェクトと NaN オブジェクトはどこにありますか?

4

3 に答える 3

3

nullundefinedは値です。偶然にも (または単なる賢明な選択)、それらの型は、仕様で定義されているように、nullそれぞれvalue / typevalue / typeです。これは、演算子を使用して表示することもできます。undefinednull undefined typeof

typeof undefined; // "undefined"
typeof null     ; // "null" (in ES6) and "object" in <=ES5 (bug)

値は、値の「種類」を示す型に関連付けられています。

于 2012-07-30T12:51:16.330 に答える
3

「値と型の違いは何ですか?」という質問に答えるには :

はある種のカテゴリであり、はそのカテゴリの具体的なインスタンスであると考えてください。

たとえば、タイプがStringあり、具体的な値は になります"foo"。type にはさまざまな値が存在する可能性がありますが、との型に使用Stringできる値は 1 つだけで、それぞれとです。NullUndefinednullundefined

仕様のセクション 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 オブジェクトはどこにありますか?

InfinityNaNはtype のなので、次のようにオブジェクトをNumber作成できます。Number

new Number(1/0) // Infinity
new Number("a") // NaN

Numberとにかく、オブジェクトを使用することはめったにありません。

于 2012-07-30T13:40:49.587 に答える
0

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、言語の一部にすぎない型です。

于 2012-07-30T12:50:44.143 に答える