2

多くのサイトで、たとえば次の 2 つが異なることを読みました。

var s1 = String('s1');     // typeof s1 == 'string'
var s2 = new String('s2'); // typeof s2 == 'object'

同じことがブール値、数値などにも当てはまります。

ただし、これら 2 つの構成要素が異なる種類のオブジェクトを生成する理由について、有用な情報は見つかりませんでした。それには具体的な理由はありますか?両方のアプローチを活用する場合はありますか?

4

3 に答える 3

3
var s1 = String('s1');

String文字列プリミティブを返す関数を呼び出します。

var s2 = new String('s2');

Stringのインスタンスであるオブジェクトを返すコンストラクタとして呼び出しますString

String非コンストラクターコンテキストでいつ呼び出されたかを知っています。その場合、言語の作成者は意図的にオブジェクトを返さないことにしました。

最初の例で想像できる唯一の有用な目的はString(4)、 を作成するのような型変換'4'です。しかし、これを達成する他の方法があります。

2 番目の例の適切な使用例はないようです。コードがプリミティブを予期している場合、ラッパー オブジェクトを直接作成することは有害でさえあります。例えば:

var s2 = new String('s2');
doSomethingUseful(s2);

function doSomethingUseful(aParameter) {
  if (typeof aParameter === 'string') { //s2 isn't
于 2013-07-12T09:22:32.127 に答える
1

これがあなたのためのミニFAQです。

なぜオブジェクトがあるStringのですか?Number

プリミティブな値は、プロパティやメソッドを持っている"foobar"か、123持つことができないため、これらを実際に保持するオブジェクトが必要です。

オブジェクトはどのようStringに使用されますか?Number

これらは、エンジン自体によって暗黙的に使用されます。プリミティブのプロパティを評価するたびに、エンジンはこのためだけに新しい暗黙的なオブジェクトを作成します (これは「オートボクシング」と呼ばれます)。たとえば、次のようx = "foobar".lengthになります。

 temp = new String("foobar")
 x = temp.length
 delete temp

自分のコードでStringandオブジェクトを使用できますか?Number

できますが、ほとんど必要ありません。自動ボックス化により、すべてのオブジェクトの props とメソッドをプリミティブ値で直接呼び出すことができます。if(x)...また、プリミティブとボックス化されたオブジェクトは、たとえばvs.など、状況によっては異なる動作をしますif(new String(x))...

String()機能とはNumber()

これらはStringおよびNumberオブジェクトのコンストラクタです。さらに、 を使用せずに直接呼び出すと、new型変換が実行されます。つまり、それぞれの型の新しいプリミティブ (オブジェクトではない) が返されます。疑似コードでは、背後にあるロジックは次のStringようになります。

function String(primitiveValue) {
     primitiveString = convert_to_string(primitiveValue)
     if called with new
         return new StringObject(primitiveString)
     else
         return primitiveString

参考:http ://es5.github.io/#x15.5.1

String()への直接呼び出しはNumber()役に立ちますか?

はい!型キャストが必要になるたびに、これらを使用したいと思うでしょう。+xの代わりにNumber(x)またはx+""の代わりに のようなハックを好む人もいますString(x)が、明示的なキャストはよりきれいに見えます。

なぜtypeof new String()でありobject、ではないのstringですか?

によって作成されたものはすべて、new特定のコンストラクターが使用されているかどうかに関係なく、オブジェクトです。

于 2013-07-12T10:10:45.687 に答える