まず、C では「文字列は、最後の elem = '\0' を持つ文字の配列です」。それらは変更可能です。
次のように C で文字列を宣言して初期化すると、次のようになります。
char str[] = "Foo";
あなたが基本的にやっていることは、4 バイトを予約することです (おそらく 8 ビットバイトです。気にしないでください)。str という単語は、この配列の最初の要素へのポインタとして機能します。したがって、次のようにする場合:
str[0] or *(str) = 'G'
次に、新しい配列を作成する代わりに、そのアドレスの値を変更します。str のアドレスを出力することで確認できます。どちらの場合も同じになります。
JavaScript の場合、文字列はプリミティブ型です。文字列に対するすべての操作は、参照ではなく値によって行われます。したがって、これを行うと true が生成されます。
var str1 = "foo";
var str2 = "foo";
str1 === str2; => true
string の初期化は、"foo" に適合するバッファを要求し、名前 str1 をそれにバインドします。それらを不変にするのは、そのバッファーを変更できないことです。したがって、これを行うことはできません:
str1[0] = 'G'
非厳密モードでこのコマンドを実行しても、警告やエラーは発生しませんが、str1 は変更されません。あなたはそれを確認することができます
console.log(str1) => "foo"
しかし、あなたがこれを好きなら:
str1 = "goo"
あなたが実際に行っているのは、「goo」に適合し、識別子 str1 をそれにバインドする新しいバッファを要求していることです。「foo」を含む古いバッファに変更はありません。
では、"foo" はどうなるでしょうか。
Java Script には自動ガベージ コレクタがあります。任意の識別子または ... によって参照できなくなったメモリのチャンクを確認すると、そのメモリは解放されていると見なされます。
同じことがnumber、booleansにも起こります。さて、ラッパーオブジェクトについて!次のように文字列のプロパティにアクセスしようとするときはいつでも:
str1.length;
JavaScript は、String クラスを使用して新しいオブジェクトを作成し、文字列のメソッドを呼び出します。関数呼び出しが戻るとすぐに、オブジェクトは破棄されます。以下のコードでさらに説明します。
var str = "nature";
str.does = "nurtures"; //defining a new property;
console.log(str.does) => undefined
オブジェクトが破壊されたためです。これを試して!
var str = new String("Nature");
str.does = "nurtures";
console.log(str) => ??
この str は実際にはオブジェクトです...
結論: C では、単一のスコープで変数名がポインターとして機能します。したがって、int、float、string はすべて変更可能です。しかし、Java Script では、プリミティブ型の変数名は参照ではなく値として機能します
参考文献: C++ 入門プラス、Java Script The Definitive Guide、C by Stephen Kochan