これがあなたのためのミニFAQです。
なぜオブジェクトがあるString
のですか?Number
プリミティブな値は、プロパティやメソッドを持っている"foobar"
か、123
持つことができないため、これらを実際に保持するオブジェクトが必要です。
オブジェクトはどのようString
に使用されますか?Number
これらは、エンジン自体によって暗黙的に使用されます。プリミティブのプロパティを評価するたびに、エンジンはこのためだけに新しい暗黙的なオブジェクトを作成します (これは「オートボクシング」と呼ばれます)。たとえば、次のようx = "foobar".length
になります。
temp = new String("foobar")
x = temp.length
delete temp
自分のコードでString
andオブジェクトを使用できますか?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
特定のコンストラクターが使用されているかどうかに関係なく、オブジェクトです。