1

変数が変化する理由がわかりません

if(chat.users[i + 1])
    console.log("1: " + chat.users[i + 1].username);
if(save[i+1])
    console.log("2: " +  save[i + 1].username);

chat.users[i + 1] = save[i];

if(chat.users[i + 1])
    console.log("3: " + chat.users[i + 1].username);
if(save[i+1])
    console.log("4: " + save[i + 1].username);

私は持っている

1: test1
2: test1
3: test
4: test

なぜ持っていないのか理解できない

1: test1
2: test1
3: test
4: test1

ありがとう

編集:すべてのコードがあります

http://codepaste.net/gi5ghf (92行目)

4

2 に答える 2

1

あなたのコードでそれは明らかです!見てみましょう

var chat = {
        users: [
            {
                username: "test"
            },
            {
                username: "test1"
            }
        ]
    },
    // creating reference from save to chat.users
    save = chat.users,
    i = 0;
if (chat.users[i + 1]) {
    // should be chat.users[1].username ("test1")
    console.log("1: " + chat.users[i + 1].username); // output "test1"
}
if (save[i + 1]) {
    // should be save[1].username ("test1")
    console.log("2: " + save[i + 1].username); // output "test1"
}

/*
 * creating reference
 * so chat.users[i + 1] is now save[i] ({ username: "test" })
 * and because save is reference of chat.users, save[i + 1] is now also now save[i] ({ username: "test" })
 */
chat.users[i + 1] = save[i];

if (chat.users[i + 1]) {
    // should be chat.users[1].username ("test")
    console.log("3: " + chat.users[i + 1].username); // output "test"
}
if (save[i + 1]) {
    // should be chat.users[0].username ("test")
    console.log("4: " + save[i].username); // output "test"
}

何?

もう一度説明させてください。たとえば、次のようになります。

var a = [1, 2];

今、あなたはこれを書きます:

var b = a;

a を b にコピーしたかったのかもしれませんが、参照しか作成していません!

だからこれを見てください:

console.log(a, b);
//=> [1, 2] [1, 2]
a[0] = 3;

console.log(a, b);
//=> [3, 2] [3, 2]

b[0] = 4;

console.log(a, b);
//=> [4, 2] [4, 2]

したがって、オブジェクトまたは配列の 1 つの値を変更すると、他の値も変更されます。これは単なる参照であり、両方とも同じメモリ アドレスを取得しているためです。

オブジェクト/配列を本当にクローン/コピーしたい場合は、この質問を見てください。

于 2012-12-10T23:36:53.787 に答える
0

save[i] は、ユーザー名が「test」のユーザーのようです。このユーザーをchat.users[i + 1]に割り当てています:

chat.users[i + 1] = save[i];

次に、ユーザー名を印刷します。

if(chat.users[i + 1]) console.log("3: "+chat.users[i + 1].username);

最後に、save[i] のユーザー名を出力しています。

if(save[i+1]) console.log("4: "+save[i].username);

save[i] のユーザー名が「test」であるため、「test」と出力されます。

おそらく、save[i] のユーザー名ではなく、save[i + 1] のユーザー名を出力する最後の行を意味していたのでしょうか? save[i + 1] のユーザー名は「test1」です。

于 2012-12-10T23:33:30.807 に答える