2.このような配列の場合、「x[0]」に配列である[1, 2];が代入されているわけですよね。
違います。**「x」**に配列である[1, 2];が代入されています。「x」と「x[0]」は全く異なるものです。それを元にもう一度考え直してみてください。
ここから先は詳しい説明なのですが、私の力不足で小難しい表現になってしまっています。初心者のかたは混乱するだけなので読まないことをお勧めします
JavaScript(ECMAScript)の変数というのはオブジェクトに対するラベルのようなものです。代入というのは、右辺の評価値に対して左辺の名前を付けているだけ、左辺値を右辺値に束縛しているだけです。これはプリミティブ値でもオブジェクトでも同じです。
初めに1.のコードを見に行きましょう。
これはリテラル1
の評価値であるnumberの1に対して、「x」という名札を用意し、紐付けましたという意味です。これを「x」をnumberの1に束縛する(bind)、numberの1を「x」に代入する(assigne)と言います。
次のこの文は何でしょうか?まずすることは右辺の評価値を求める事です。x
を評価するというのは「x」の名札がつけられている物を見に行くと言うことです。これは先程の文でnumberの1に紐付けたのでした。ですので、x
の評価値はnumberの1であり、前の文の1
の評価値と全く同じ物です。お気づきの通り、後は同じです。「y」という名札が用意され、numberの1に紐付けられたのでした。
let
がありませんが、名札はもう作ってあるので再度用意しないと言うことに過ぎません。さて、これはいわゆる再代入となりますが、これは、名札を別の物に紐付けると言うことです。5
の評価値はnumberの5ですので、「x」はnumberの5に紐付けられるようになりました。このとき、「y」は何もしていません。相変わらずnumberの1を見に行っていますので、何も影響は受けません。
そして、x
とy
についてそれぞれ確認すると5と1になるというのがよくわかると思います。
では、配列のパターンを見ていきましょう。
先程違い配列なのですが、まず、リテラル[1, 2]
とはどのような物なのかを理解する必要があります。これは「0番目(プロパティ"0")が1
の評価値、1番目(プロパティ"2")が2
の評価値となる新たに作成された配列(Array)」が評価値です。個々で注意して欲しいのは、配列が生成されていると言うことです。そして、この新たな配列に紐付けられた名札「x」が用意されたと言うことになります。
さてさて、次の文のx
の評価値は何でしょうか?そう、先程の文で作成された配列です。ここでまた配列が作成されるのではなく、「x」が示す物がそのまま「y」が示す物になります。言い換えれば、「x」と「y」は同じ物に束縛されています。
気づきましたか?ここまでは先程と同じです。
この文は最初の1.と異なります。もしx = 5;
であれば、1.と全く同じ説明で良かったはずです。「x」が示す物がexotic objectである配列であるためちょっと特殊な処理があるのですが、ここではその性質はほとんど無視して説明が可能です。この文はx["0"] = 5;
とも解釈できます。"0"はプロパティ名で、配列の場合は0番目も意味します。このような書き方では、変数の代入ではなく、プロパティへの代入とみなされます。
JavaScriptのオブジェクト(配列もオブジェクトの一種)はプロパティという物を持ちます。プロパティは名前(文字列またはシンボル)と値の組合せです。プロパティは変数と似ており、これもまた名札のような物です。x
の評価値、つまり、「x」の名札が示す先の配列もまた、プロパティ"0"にnumberの1、プロパティ"1"にnumberの2というがあります(他にも特殊なプロパティ"length"等も設定されています)。今回の文は、このプロパティ"0"に5
の評価値であるnumberの5を代入するということです。
もっと別の言い方で言いましょう。もともとは、「x」の名札が示す先の配列があり、その配列が「0」の名札を持っていて、その「0」の名札が示す先がnumberの1でした。しかし、今回の代入文によって、「0」の名札が示す先がnumberの5に変更された言うことです。
さて、このとき「x」の名札が示す先と「y」の名札が示す先は変わったでしょうか?いいえ、変わってはいないはずです。変わったのは配列が持っていた名札であって、「x」も「y」も何も変えていません。これら二つは最初の文で作成された配列を変わらずに示し続けています。
ここまで来たら後はわかりますね。x
を評価するとき、先程の配列になるという話でしたが、console.logでは配列の中にある名札についても評価して表示します。それらは、5と2でしょう。では、y
を評価するときはどうなるかというと、これはx
を評価したときと同じ配列なのですから、同じように5と2となるというわけです。
以上ですが、この話はJavaScriptについてです。PythonやRubyも同じような言語設計になっていますが、C等は変数は名札ではなく箱なので全く異なります。まだ、よくわからないという内は、あまり気にしない方が良いかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/23 03:41