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';
(「タイプ変換とテスト:私たちはfoo
がString
オブジェクト呼ばていることを確認したい場合は、我々は意図的にそれを行う必要があるだろう")とセクション11.2.1("プロパティアクセサ ")はthe specにありますが、これは通常の扱いにくい仕様です。 :-)
あなたの質問は "...このオートマチックラッピングの理由はありますか?"下:はい。このプリミティブからオブジェクトへの自動プロモーションは非常に重要です。たとえば、
var foo = "bar";
alert(foo.length);
プリミティブにはプロパティがないため、自動プロモーションがないと、上記の2行目は失敗します。 (当然のことながら、実装は実際オブジェクト作成は限り仕様を外部指示通りに振る舞うように、必要とされないように最適化して自由である。)同様に:
var foo = "bar";
alert(foo.indexOf('a')); // alerts 1
プリミティブオブジェクトではなく、そう彼らはプロトタイプチェーンを持っていないので、そのindexOf
プロパティはどこから来たのですか?もちろん、答えはプリミティブがString
インスタンスに昇格され、String.prototype
がindexOf
に昇格されているということです。
もっと劇的:
、必要に応じて数字も促進されるので、それはそれを行うために完全に受け入れられるのです
alert((4).toFixed(2)); // alerts "4.00"
。あなたがなりたかった場合もののあなたは、(リテラル数の.
は小数点ではなく、プロパティアクセサがあるので) —例えば、(4)
だけではなく4
—は文法を満たすために括弧を使用する必要が本当に難解であれば4['toFixed'](2)
を使用できます。私はしません。 :-)
しかし、なぜfoo.newPropertyがundefinedを返すのですか? fooが自動的にオブジェクトに変換されたはずですか? – Sam
@Sam:申し訳ありませんが、私はちょうどその説明を追加していました。 –
最後のビットが間違っています。 'String'オブジェクトを作成するには' new'が必要です。 –