var name = 'naGeoExit';
var name = name.substring(2,5);
console.log(name); //output: Geo
最初の名前の変数と 2 番目の名前の変数は、メモリの異なる部分に割り当てられている 2 つの異なる変数ですか、それとも元の変数の値が変更されていますか?
var name = 'naGeoExit';
var name = name.substring(2,5);
console.log(name); //output: Geo
最初の名前の変数と 2 番目の名前の変数は、メモリの異なる部分に割り当てられている 2 つの異なる変数ですか、それとも元の変数の値が変更されていますか?
それらが同じ名前を持ち、同じスコープにある場合、それらは同じ変数です。
1 行目では、メモリ内に「naGeoExit」を含む文字列があります。スコープ内に、name
それを指すという変数があります。
2 行目には、メモリ内の文字列のサブシーケンスのコピーがあります。変数name
はそれを指すようになりました。元の文字列オブジェクトへの参照がないため、ある時点でガベージ コレクションが行われます。
キーワードを使用するvar
と、「(グローバル スコープではなく) 現在のスコープで変数を作成する」ことを意味します。現在のスコープは、関数定義などのクロージャです (ただし、関数内にいない場合はグローバル スコープになることもあります)。
2 回使用しても構文エラーではありませんvar
が、その目的は新しい変数を作成することであり、スコープごとに 1 回だけ使用する必要があります。2回目のラウンドは効果がありません。
はい、元の文字列は変更されていません。ただし、あなたの例では、ガベージ コレクションにすぐに利用できます。
文字列が変更されていないことをより明確に示す例を次に示します。
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";