3

David Flanagan による Definitive JavaScript では、オブジェクトとプリミティブを区別しています。

彼は、プリミティブを数値、文字列、ブール、ヌル、未定義として定義しており、標準もそうです。

しかし、プリミティブをオブジェクトのサブセットとして定義する、つまりそれらをプリミティブ オブジェクトと呼ぶ方が正確でしょうか。

独自のメソッドがあり、複雑なエンティティであるためです。

実際の質問

String、Boolean、および Number を定義する場合、Primitive Object は Object よりも正確でしょうか?

4

3 に答える 3

3

オブジェクトとプリミティブは異なります。

typeof 42 === "number"             
typeof new Number(42) === "object"
new Number(42) !== 42

ただし、必要に応じて、プリミティブは一時オブジェクトによって自動的にラップされます。一時オブジェクトは、自動的にプリミティブに変換して戻すことができます。

(42).toString() === "42"
new Number(42) == 42
new Number(42) + 1 === 43

特にJavaおよびC#プログラミング言語のコンテキストでは、この種の動作はオートボクシングと呼ばれます。ラッパーオブジェクトにはいくつかの紛らわしい特性があるため、たとえば次のようになります。

Boolean(new Boolean(false)) === true

それらを意図的に変数に格納することを避け、代わりに可能な限りプリミティブを使用することをお勧めします。

于 2013-01-18T21:56:20.727 に答える
2

それはセマンティクスについてではありません、見てください:

var threePrimitive = 3;
var threeObject = new Number(3);

threePrimitive.toFixed(2); // 3.00
threeObject.toFixed(2); // 3.00

threePrimitive.foo = true
threeObject.foo = true;
threePrimitive.foo; // undefined
threeObject.foo; // true

プリミティブは、メソッドを呼び出そうとするとオブジェクトにラップされますが、最初に使用した後、オブジェクトは破棄されます。


これが仕様でどのように述べられているかについては、100%確信はありませんが、これが私が思うことです(Bergiが彼の回答の1つに残したヒントに基づいています。セクション11.2.1は、アクセサーのプロパティを評価する必要があると述べています次のように:

  1. baseReferenceをMemberExpressionの評価結果とします。
  2. baseValueをGetValuebaseReference)とします。

(...)

次に8.7.1では、次のように表示されます。

次の[[Get]]内部メソッドは、Vがプリミティブベース値を持つプロパティ参照である場合にGetValueによって使用されます。これは、値としてbaseを使用し、引数としてthisプロパティPを使用して呼び出されます。次の手順が実行されます。

  1. OをToObject(base)とします。
  2. プロパティ名PでOの[[GetProperty]]内部メソッドを呼び出した結果をdescとします。
  3. descが未定義の場合は、undefinedを返します。
  4. IsDataDescriptor(desc)がtrueの場合、desc。[[Value]]を返します。
  5. それ以外の場合、IsAccessorDescriptor(desc)はtrueである必要があるため、
  6. getterをdesc。[[Get]]にします。getterが未定義の場合は、undefinedを返します。
  7. ベースをthis値として提供し、引数を提供しないgetterの[[Call]]内部メソッドを呼び出した結果を返します。

注手順1で作成された可能性のあるオブジェクトには、上記のメソッド以外ではアクセスできません。実装は、オブジェクトの実際の作成を回避することを選択する場合があります。この内部メソッドを使用するこのような実際のプロパティアクセスが目に見える効果をもたらす可能性がある唯一の状況は、アクセサー関数を呼び出す場合です。

于 2013-01-18T20:58:08.017 に答える
1

文字列、ブール値、および数値を定義する場合、プリミティブオブジェクトはオブジェクトよりも正確でしょうか?

ここでは、数字がオブジェクトではないと言っているのではなく、あいまいに見えることを指摘していることに注意してください。これは、JavaScriptの初心者を混乱させるようなものです。

区別はほとんど学術的ですが、あいまいに見える場合が1つあります。リテラルが数値を表すように見える場合を除いて、リテラルはプリミティブオブジェクトを表します。メソッドをリテラル整数*シンボルに直接適用することはできません。

1.toString();
SyntaxError: identifier starts immediately after numeric literal

…しかし、あなたは数字の方法を適用することができます:

Number(1).toString();
'1'

…そして数字を含む名前は数字です:

x = 4;
x.toString();
'4'

これは実際には構文解析の問題だと思いますが、パーサーが1「abc」が文字列であると判断できるほど簡単に数値であると判断できない理由はよくわかりません。.シンボルの意味のあいまいさに関係していると思います。(小数点ですか、それともメソッド演算子ですか?)

*JavaScriptには実際には整数がありません。完全にで構成されるシンボルを意味します[0-9]+

于 2013-01-18T20:56:31.060 に答える