2013-07-30 28 views
8

今日は殺すためにあまりにも多くの時間を持つことが起こったと私は、Node(v0.10.13)コマンドラインでビットを果たし:何instanceofが行うことで、MDNによると、今なぜJavaScriptプリミティブはオブジェクトのインスタンスではありませんか?

> 1 instanceof Object 
false 
> (1).__proto__ 
{} 
> (1).__proto__ instanceof Object 
true 
> (1).__proto__.__proto__ === Object.prototype 
true 

instanceof演算子は、オブジェクトがプロトタイプ にコンストラクタのprototypeプロパティをチェーンしているかどうかをテストします。

しかし明らかにObject.prototypeはのプロトタイプチェーンです。だから1 instanceof Objectはなぜ間違っていますか?おそらく1はプリミティブではないから始めるのだろうか?

さて、私はそれを受け入れ、と私はより多くのテストをしました:

> (1).__proto__ === (2).__proto__ 
true 
> 'a'.__proto__ === 'b'.__proto__ 
true 
> (1).__proto__ === 'a'.__proto__ 
false 
> (1).__proto__.__proto__ === 'a'.__proto__.__proto__ 
true 
> (1).__proto__.type = 'number' 
'number' 
> 'a'.__proto__.type = 'string' 
'string' 
> (2).type 
'number' 
> (1.5).type 
'number' 
> 'b'.type 
'string' 

だから明らかに、すべての数のプリミティブが一つのオブジェクトから継承し、すべての文字列プリミティブは、他のオブジェクトから継承します。これらの2つのオブジェクトはどちらも Object.prototypeから継承されます。

数字と文字列をプリミティブと見なすと、他のオブジェクトからそれらを継承するのはなぜですか?逆に、他のオブジェクトを継承するときにも、そのオブジェクトも考慮する必要があります。オブジェクトの子がオブジェクトではないことは無意味なようです。

ところで、私もFirefox 22でこれらをテストして同じ結果を得ました。

答えて

25

「ボクシング」(c# related articlejava related article)として知られているメカニズムに惑わされています。あなたは最初に正しい答えを持っていた:

おそらく1は初めから始まっていないプリミティブなのだろうか?

正確にそうです。しかし、どのようにプリミティブにメソッドを含めることができますか?彼らはどのようにプロパティを含むことができますか?結局のところ、jsでは、それらは可能な最低レベルで表されます(#4.3.2参照)。あなたがprimitive.propertyを行うたび、これらの値は、実際に有用にするために、以下の(#11.2.1)を発生します。

Object(primitive).property; 

つまり、JSは自動ボクシングを持っています。これは私のお気に入りのトリックのいずれかを使用して証明することができます。

var primitive = 'food'; 
primitive.isPizza = true; //yummy 
console.log(primitive.isPizza); //undefined. where did my pizza go!? 

primitive.isPizzaがあるため、このボクシングの消滅:

var primitive = 'food'; 
Object(primitive).isPizza = true; 
console.log(Object(primitive).isPizza); 

箱入りprimitiveは、独自のユニークな雪の結晶です - あなたはそれをもう一度ボックスとき、それは同じことを指していません。ボックス化された値はすぐにGCdされ、時間の霧の中で忘れられます。あなたのプリミティブがない場合、これは発生しません

、よく、プリミティブは:

var obj = new String('food'); 
obj.isPizza = true; 
console.log(obj.isPizza); //true 

これは、あなたがオブジェクトのみ、決してプリミティブを使用する必要があるということですか?いや、時間はあなたが非常に遠く及び少数であり、オブジェクトは、物事を複雑にプリミティブ上のメタデータを保存する必要がありますかという単純な理由のために:

obj === primitive; //false, obj is an object, primitive is a primitive 
+0

グレート答えは、感謝。 –

+0

すべてのマイ+1があなたに行く! – Greg

+0

Myne 2 .... :-)。 –

関連する問題