2013-03-27 8 views
12

JavaScriptの文字列は基本型なので、文字列を関数に渡すと、関数のローカルコピーが作成されますか?私はあなたが作成された後に文字列を変更することができないので、これについて疑問に思っています。そのため、JavaScript VMは文字列のアドレスを内部的に関数に渡すだけでは不合理に見えます。関数に文字列を渡すことは、それを値でコピーするか、参照で渡すことはできますか?

私はこれについて心配するべきではないことを誰かに教えてくれる人がいれば(これはWebデベロッパーと話すときに起こります)、私はHTML5ゲームに取り組んでおり、ガベージコレクションは大きな問題です。知っている。

+4

多分愚かな質問かもしれませんが、なぜそれを試してみませんか? – Uby

+2

すべてのプリミティブ型が値渡しされます。 http://snook.ca/archives/javascript/javascript_pass –

+0

@silentboyを参照してください。文字列値はプリミティブのように扱うことができますが、文字列は値渡しされません。 –

答えて

10

文字列は参照渡しされます。あなたは新しい文字列を取得します(例:。value+="more"を行うことによって)、それを変更しようとするので、いつでも

文字列は変更できません。

も参照してください。T.J @What does immutable mean?

。 Crowder:by value by ref。もしあなたが正しい言語定義を見ているなら。しかし、文字列のコピーを実際に作成する実装があるとは思えません。なぜなら、それは非常に遅いからです。また、文字列は不変のプリミティブなので変更できないのでコピーする必要はありません。

+2

* "文字列は参照によって渡されます。"それの証拠はありますか?私はそれが本当であると信じています(または、より正確には、文字列への参照が値渡され、JavaScriptの何も**は「参照渡し」ではないと信じます)。しかし、何かを引用することができないと、大げさな事実として。 –

+0

@ Chris:文字列の内容のコピーがコピーされているとは言いません。私は合理的に彼らが(私の答えで言ったように)、それらの内容への参照が(値で)関数に渡されていないことを確信しています。 –

+0

私は文字列が不変であることを知っています、私は質問で、それが私が最初にそれを求めた理由です。私はおそらく誰かが参照を与えることができない限り、明日この答えを受け入れるでしょう。答えは常識に基づいていますが、私はそれがこれらの事になるとより多くを求めるのは難しいと思います。 – dreta

5

この点については、この仕様が黙っていると思います。しかし、文字列が理論的には「プリミティブ」であっても、その内容をメモリに渡すのではなく、文字列の実際の内容を渡すことは、まったく馬鹿げた実装になります。私はほとんどの実装でオブジェクト参照(これに関しては明らかに===のような他のものではない)を扱うときと同じように "プリミティブ"文字列を扱うと思うが、Objectのトラッピングではない。

+0

'==='の良い点。 – Taurus

+0

何かへの参照が渡された場合、次の例の 'b'も' bar'プロパティを持つ方が妥当でしょうか? 'var a =" foo " var b = a; ["bar"] = "baz"; console.log(b ["bar"]); '今、私はこの混乱の原因となっているボクシングの何かがあると確信しています、それは何ですか? – Taurus

+0

@Taurus:これはJavaScriptの混乱する部分ですが、仕様でカバーされています。 JavaScriptはstring * primitives *とstring * objects *の両方を持っています。 'a'は*プリミティブ*文字列' 'foo ''を参照しています。 'a [" bar "] =" baz "'というステートメントは 'a'からプリミティブな文字列を取得しますが、それをオブジェクトのように使用するので、新しい一時文字列オブジェクトが作成され、その部分に使用されます。その一時的な文字列オブジェクトは 'bar'プロパティを取得しますが、何も保存されないので*(続き)* –

関連する問題