2010-12-10 3 views
4

Javascriptのシンプルな型は不変であり、Objectsのようなキー付きコレクションではありません。なぜ次のコードは不平を言っていないだけで代入の値を返しますか?Javascriptで単純型のプロパティに値を代入しようとすると、例外がスローされないのはなぜですか?

var foo = 'bar'; 
foo.newProperty = 'blaha'; 

2番目のステートメントは 'blaha'を返します。しかし、今すぐfoo.newPropertyを呼び出すと、簡単なタイプがハッシュではないので、undefinedが自然に得られます。ですから、プロパティ代入の試行は、Pythonのタプルの値を置き換えるときにTypeErrorを取得するのと同じ方法で例外をスローするべきではありません。または、foo.newPropertyが予期しない何かに評価されるような構文のなんらかの機能がありますか?

答えて

5

foo.newPropertyを機能させるための構文が不明瞭です。 :-)文字列と数字はプリミティブとオブジェクトのどちらでもかまいません。インタープリターは、必要がある場合、プリミティブからオブジェクトに自動的に変換します(逆も同様です)。

var foo = 'bar';    // `foo` is a primitive 
alert(typeof foo);   // alerts "string" 
var foo2 = new String('bar'); // `foo2` is an object 
alert(typeof foo2);   // alerts "object" 

原始的な作品にプロパティを追加しますが、その後は、後に働いているしていないようだ理由は、変換は式のみの目的であるということです。私がやるので、場合:

foo.newProperty = 'blaha'; 

プリミティブ文字列値は、我々は新しいが割り当てられていない(発現させるため、変数、その後の発現のためのオブジェクトにプリミティブから変換fooだけから取得されます値をfooという変数に設定すると、式のためにfooから検索された値が変更されただけです)。このオートマジックの変換は、セクション9で(ビット)に覆われている

foo = new String(foo); 
foo.newProperty = 'blaha'; 

(「タイプ変換とテスト:私たちはfooStringオブジェクト呼ばていることを確認したい場合は、我々は意図的にそれを行う必要があるだろう")とセクション11.2.1("プロパティアクセサ ")はthe specにありますが、これは通常の扱いにくい仕様です。 :-)

あなたの質問は "...このオートマチックラッピングの理由はありますか?"下:はい。このプリミティブからオブジェクトへの自動プロモーションは非常に重要です。たとえば、

var foo = "bar"; 
alert(foo.length); 

プリミティブにはプロパティがないため、自動プロモーションがないと、上記の2行目は失敗します。 (当然のことながら、実装は実際オブジェクト作成は限り仕様を外部指示通りに振る舞うように、必要とされないように最適化して自由である。)同様に:

var foo = "bar"; 
alert(foo.indexOf('a')); // alerts 1 

プリミティブオブジェクトではなく、そう彼らはプロトタイプチェーンを持っていないので、そのindexOfプロパティはどこから来たのですか?もちろん、答えはプリミティブがStringインスタンスに昇格され、String.prototypeindexOfに昇格されているということです。

もっと劇的:

、必要に応じて数字も促進されるので、それはそれを行うために完全に受け入れられるのです
alert((4).toFixed(2)); // alerts "4.00" 

。あなたがなりたかった場合もののあなたは、(リテラル数の.は小数点ではなく、プロパティアクセサがあるので)  —例えば、(4)だけではなく4   —は文法を満たすために括弧を使用する必要が本当に難解であれば4['toFixed'](2)を使用できます。私はしません。 :-)

+0

しかし、なぜfoo.newPropertyがundefinedを返すのですか? fooが自動的にオブジェクトに変換されたはずですか? – Sam

+0

@Sam:申し訳ありませんが、私はちょうどその説明を追加していました。 –

+0

最後のビットが間違っています。 'String'オブジェクトを作成するには' new'が必要です。 –

関連する問題