JavaScriptの変数への代入について

このQ&Aのポイント
  • 単純なデータ型と配列での変数への代入の動作について説明します。
  • 単純なデータ型では、別の変数に代入しても影響を受けないのに対し、配列では参照渡しのため同じ値を参照します。
  • JavaScriptの基礎的な概念を理解するために、データ型と変数の扱い方について学習することをおすすめします。
回答を見る
  • ベストアンサー

JavaScriptの変数への代入について

<単純なデータ型> 1. 以下のようなケースでxに5という値を代入すると1行目の「let x = 1;」で「x」の値が5に変わるというのは理解できます。 この場合、2行目は「y」の値は「1」のままです。「5」でないのがわかりません。 代入したことによって「let y =x」へは影響を及ぼさないのはなぜですか? 少なくともスコープの範囲以内は代入の影響が出るものと考えてしまいます。 { let x = 1; let y = x; x = 5; console.log(x); //5 console.log(y); //1 } <配列> 2.このような配列の場合、「x[0]」に配列である[1, 2];が代入されているわけですよね。 以下のように「x[0]」に5を代入した場合、console.logで見てみると、[5, 2]となるのは理解できます。 しかし、2行目の「let y = x;」も[5, 2]となっています。 上の単純なデータ型のケースをもとに考えるならば、ここは[1, 2]のままでないのはなぜなのでしょうか? 試しに自分で「x[1]」に書き換えてみると両方とも「1, 5」となります。 { let x = [1, 2]; let y = x; x[0] = 5; console.log(x); //[5, 2] console.log(y); //[5, 2] } なぜ、単純なデータ型と配列ではパターンが異なってくるのでしょうか? 初心者です。学習中でまだ基礎的な段階なのですが、つまづいてしまいました。 分かる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.2

「let y=x;」 という書き方は同じですが、最初のプログラムと2番目のプログラムには大きな違いがあり、結果の違いとして表れてきます。 実は後者のプログラムで、「x[0]=5;」と書かなければ代入できないことにも関連してはいるんですが、まあ置いといて。 最初のプログラムの場合、 >let x = 1; >let y = x; >x = 5; これだと、[ x ] という変数の箱と、[ y ] という変数の箱が用意されるイメージですね。 [ x ] という箱に最初 1 が入る。 [ y ] という箱に、xの中身 1 がコピーされる。 その後、[ x ] に 5 という値を入れる。 →x=5, y=1 となる。 まあ、これは見えている通り理解できるでしょう。 -- そして次のプログラム。 >let x = [1, 2]; ここで、[ x ] という箱は1つなんですから、複数の値を保持することはできません。 でも現実に、プログラムは動いています。 どうなっているかというと、[ x ]には「[1, 2] という配列(メモリ領域)の先頭アドレス」が入るのです。 そして、 >let y = x; とした時、[ y ] には [ x ]と同じ、「[1, 2] という配列(メモリ領域)の先頭アドレス」がコピーされます。 さてそうすると。 >x[0] = 5; この代入式は、「xが指している配列領域の、最初の要素に、5を入れる」ということです。 そうすると、xの指している配列(メモリ)領域は、「[5, 2]」に変化します。 そして、xの指している配列(メモリ)領域とyの指している配列(メモリ)領域は同一であるので、y から見た場合の配列も、[5, 2] が見えるわけです。(同じものを見てしまっています) 変数に、値そのものを保持するか、値の格納先(参照)を保持するかは、プログラマ次第。 後者のプログラムは知らずに参照を使っていたわけなので、混乱したんでしょうね。 即値を格納する変数と、参照(ポインタ)を格納する変数を、変数名でも区別がつくようにしておくと、後々自分のためになるかもしれません。

その他の回答 (1)

  • ngwaver
  • ベストアンサー率26% (323/1202)
回答No.1

値渡しと参照渡しで調べてみるとよいかと思います。

関連するQ&A

  • (JavaScript)変数や文字列難しい

    JavaScript 第1問目 // [変数 - 右辺が変数を使った式1] // ---------------------------------------- // 変数sに、変数piの値に変数rの値を2回掛け合わせた値を代入してください let pi = 3.14; let r = 5; ×let s = ; console.log("円の面積は" + s); ※×は間違い。 第2問目 // ---------------------------------------- // [文字列 - 大文字に変換1] // ---------------------------------------- // 変数cの文字を大文字に変換して出力してください let c = "p"; ×console.log(toUpperCase+()); ※×は間違い。 第1問目 ×let s = ;のところですが、let s = (3.14*5)+(3.14*5);でも間違いです。変数sに、変数piの値に変数rの値を2回掛け合わせた値の計算方法やコードは何でしょうか? 第2問目 ×console.log(toUpperCase+());のところですが、console.log(toUpperCase+("p"));やconsole.log(toUpperCase+("c"))は違います。console.log{toUpperCase+}も違います。大文字に変換するコードは何でしょうか?

  • JavaScript変数

    // ---------------------------------------- // [変数 - 右辺が変数を使った式2] // ---------------------------------------- // 変数a2に変数aの値を2倍した結果を代入してください let a = 256; let a2 =; console.log("aを2倍すると" + a2); let a2 = a % 2 === 0;は違います。 変数a2に変数aの値を2倍した結果になるのでしょうか?

  • プログラミングJavaScript「変数」

    JavaScript 問題1 (変数) // ---------------------------------------- // [変数 - 右辺が定数3] // ---------------------------------------- // 変数nameに文字列"taro"を代入してください △let name = "taro"; console.log("my name is " + name); ※△はエラー △let name = "taro";のところエラーになるのはどうしてでしょうか。 問題2 // ---------------------------------------- // [変数 - 変数の内容を出力2] // ---------------------------------------- // 変数nameの内容を出力してください △let name = "Tom"; console.log(); ※△はエラー △let name = Tom;のところエラーになるのはどうしてでしょうか。 △let name = "Tom";もエラーになる。

  • JavaScriptの問題に関して教えてください。

    下記問題の解き方および答えが考えても全然分からず、お教えいただきたいです。お願いいたします。 以下のプログラムを読んで、どういったプログラムなのかを説明してください。 let change = 0; let change_sum = 0; const data = [ 31, 41, 59, 26, 53, 58, 97, 93, 23, 84 ]; console.log("並べ替える前"); for (let i = 0; i < data.length; i++) { console.log(data[i] + " "); }// for console.log("\n"); console.log("***********************************"); console.log(""); for (let i = 0; i < data.length - 1; i++) { for (let j = i + 1; j < data.length; j++) { if (data[i] > data[j]) { let a = data[i]; data[i] = data[j]; data[j] = a; change++; }// if }// for(内側1) console.log((i + 1) + "回目"); console.log(`${change}回`); for (let k = 0; k < data.length; k++) { process.stdout.write(data[k] + " "); }// for(内側2) console.log("\n"); change_sum += change; change = 0; }// for(外側) //最終結果の表示 console.log("***********************************"); console.log(""); console.log(`${change_sum}回`); console.log("最終結果"); for (let i = 0; i < data.length; i++) { process.stdout.write(data[i] + " "); }// for console.log("");

  • 2変数関数の計算方法

    1/(√y)=2log_[10](x・√y)-0.8 という関数のyの値が分かっている場合のxの値は、上式を変形して、 log_[10](x)={1/(2√y)}-log_[10](√y)+0.4 x=10^[{1/(2√y)}-log_[10](√y)+0.4] にしてyの値を代入すれば、xの値を求める事ができます。 逆にxの値が分かっていてyの値が分からない時の計算方法ですが、この関数はy=の形に変形できません。 どうやって計算すればよいのでしょうか? Excelを使って計算できないでしょうか。申し訳ありませんが、お分かりになる方教えてください。 よろしくお願いします。

  • ポインタ変数への値代入とアドレス値の代入について

    ポインタの扱いについて2点ほどありますが教えてください。 質問1:ポインタへの値代入    short data1[5];    short *pointa;     pointa = data1    (1)*(pointa + 1)=100;    (2)*pointa + 1 = 100;   という式があった場合、    (1)はdata1[1]の配列に100を代入する    (2)は命令違反的なことでコンパイルエラーが発生する   という理解でよろしいでしょうか? 質問2:アドレス値の代入    int var;(varのアドレス値は100番地)    int *ptr;    *ptr = &var; という式があった場合    ポインタ変数のptrには、番地が入るのではなく、100という数値が入るという判断でよろしいいでしょうか?    長い質問となっていますので質問1,2どちらか一方でも、余裕のある方がおりましたら両方についてご解答のほどよろしくお願いします。

  • 恒等式における数値代入法について

    高校数学IIの教科書には、 「f(x)、g(x)がxのn次以下の多項式であるとき、 等式f(x)=g(x)がn+1個の異なるxの値に対して成り立つならば、 この等式はxについての恒等式であることが知られている」 と書いてあります。 これについての証明は教科書に書いてありませんが、事実として は教科書に明記されているのでこのことを使っても構いません。 つまり、「f(x)、g(x)がxのn次以下の多項式であるとき、 数値代入法で、n+1個のxの値を代入して答えが出たときは 十分性の確認は不要」であり、 「f(x)、g(x)がxのn次の多項式であるとき、 数値代入法で、n個以下のxの値を代入して答えが出たときは 十分性の確認は必要」と言うことです。 では、f(x,y,z…)、g(x,y,z…)がx、y、z…のn次以下の多項式である とき、等式f(x,y,z…)=g(x,y,z…)が一体何個の異なるx、y、z…の値 に対して成り立つならば、この等式はx、y、z…についての恒等式 であることが知られているのでしょうか? たとえば、「2x^2+axy-3y^2+x+4y-1=(2x+y+b)(x-3y+c) がx,yの恒等式になるように,定数a,b,cの値を定めよ.」 という問題の場合、数値代入法で解くと、 2x^2+axy-3y^2+x+4y-1=(2x+y+b)(x-3y+c)………(1)とする.  (1)にx=0,y=0を代入すると,-1=bc………(2)  (1)にx=0,y=1を代入すると,0=(1+b)(-3+c)………(3)  (1)にx=1,y=1を代入すると,a+3=(3+b)(-2+c)………(4)  (3)から,b=-1またはc=3 i).b=-1のとき,(2)から,c=1   (4)に代入すると,a+3=-2   ∴a=-5   このとき,(1)は    2x^2+5xy-3y^2+x+4y-1=(2x+y-1)(x-3y+1) となり, 常に成立する. ii).c=3のとき,(2)から,b=-1/3   (4)に代入すると,a+3=3-(1/3)   ∴a=-1/3   このとき,(1)は    2x^2-xy/3-3y^2+x+4y-1=(2x+y-1/3)(x-3y+3)   =2x^2-5xy-3y^2+17x/3+4y-1  となり,これはx,yの恒等式ではない. i).,ii).から,答はa=-5,b=-1,c=1である. となります。この場合、f(x,y)、g(x,y)はx、yの「2」次の多項式 ですが、「2+1」個のx,yを代入しても十分性の確認は 必要でした。

  • 代入の問題について

    数学1の代入問題で分からないことがあります。 x^3+y^3の値を求めるために代入をするんですが、 解説には『(x+y)^3=x^3+3x^2y+3xy^2+y^3 -3xy(x+y)に代入する』となっています。 ですが、x^3+y^3は(x+y)(x^2-xy+y^2)で求められるはずですよね? なのになぜ前者の方法で解くんでしょうか?さっぱりわかりません!

  • ITパスポート試験

    アルゴリズム:合計の意味が理解できません。 テキストは以下の通りです。 考え方を分かり易く教えてください。 -------------------------------------------- 1+1を計算する場合: y = y +x (1)値yに0を代入する(初期化) y=0+x (2)値xに1を代入する y=0+1 (3)計算結果を、解yに代入する 1=1 (4)値xに1を代入する y=1+1 (5)計算結果をyに代入する 2=2 (6)さらに計算する場合は(4)と(5)を繰り返す -------------------------------------------

  • javaScriptの変数をJavaの変数に代入する。

    jspで作ったプログラムがあるこのような場合変数を共有する方法はありますでしょうか? 以下の場合iの(JavaScript)値をjavaの変数iに代入したい場合どうすればいいでしょうか? <%! String s[] ={A,B,C,D,E} %> function chek(){ for(i = 0;i< 5 ;i++){ <%! int i =%> = i;//←この部分です //document.form1.desc.valueにはBの値が入っている if(<%! s[i] %> == document.form1.desc.value){ alert("Bです"); } }

専門家に質問してみよう