0
 var name = 'naGeoExit';

 var name = name.substring(2,5);      
 console.log(name); //output: Geo

最初の名前の変数と 2 番目の名前の変数は、メモリの異なる部分に割り当てられている 2 つの異なる変数ですか、それとも元の変数の値が変更されていますか?

4

3 に答える 3

4

それらが同じ名前を持ち、同じスコープにある場合、それらは同じ変数です。

于 2013-06-17T10:29:41.150 に答える
3

1 行目では、メモリ内に「naGeoExit」を含む文字列があります。スコープ内に、nameそれを指すという変数があります。

2 行目には、メモリ内の文字列のサブシーケンスのコピーがあります。変数nameはそれを指すようになりました。元の文字列オブジェクトへの参照がないため、ある時点でガベージ コレクションが行われます。

キーワードを使用するvarと、「(グローバル スコープではなく) 現在のスコープで変数を作成する」ことを意味します。現在のスコープは、関数定義などのクロージャです (ただし、関数内にいない場合はグローバル スコープになることもあります)。

2 回使用しても構文エラーではありませんvarが、その目的は新しい変数を作成することであり、スコープごとに 1 回だけ使用する必要があります。2回目のラウンドは効果がありません。

于 2013-06-17T10:32:14.933 に答える
1

はい、元の文字列は変更されていません。ただし、あなたの例では、ガベージ コレクションにすぐに利用できます。

文字列が変更されていないことをより明確に示す例を次に示します。

var n1 = 'naGeoExit';

var n2 = n1.substring(2,5);      
console.log(n1); //output: naGeoExit
console.log(n2); //output: Geo

元のコードでは、という変数が1 つnameだけあり、操作の結果をそれに代入しsubstringていました。これが、元の文字列がガベージ コレクションですぐに利用できる理由です。同じスコープで同じ変数を再宣言しても効果はありません。だからコード:

var name = "foo";
var name = "bar";

...次とまったく同じです。

var name = "foo";
name = "bar";

...そして、さらに言えば、次とまったく同じです:

var name;
name = "foo";
name = "bar";
于 2013-06-17T10:33:05.357 に答える