Repl.it: https://repl.it/BuXR/3

var str = "abc";
var str2 = str.split(" ").join("").split("");
var tmp = str2;
console.log(str2);
// => ['a','b','c']
console.log(tmp.reverse());
// => ['c','b','a']
console.log(str2);
// => ['c','b','a']

Ma question est pourquoi str2 est changé même s'il n'est pas inversé?

C'est très bouleversant pour moi, mais j'ai une idée de pourquoi cela se produit. Le tmp n'est qu'un pointeur vers le str2 d'origine, et lorsque j'appelle reverse () sur tmp, il inverse en fait str2.

Même si c'est vraiment ce qui se passe, j'ai toujours l'impression que c'est une façon très contre-intuitive qu'une langue fonctionne.

13
John Chen 9 mars 2016 à 08:05

3 réponses

Meilleure réponse

Votre supposition a raison.

Le tmp n'est qu'un pointeur vers le str2 d'origine, donc quelles que soient les opérations effectuées sur str2, il sera stocké en mémoire et lorsque vous accédez à tmp, il trouve la référence à str2.

J'ai une idée de pourquoi cela se produit. Le tmp n'est qu'un pointeur vers le str2 d'origine, et lorsque j'appelle reverse () sur tmp, il inverse en fait str2.

12
Hemant Metalia 9 mars 2016 à 15:16

Ma question est pourquoi str2 est changé même s'il n'est pas inversé?

Puisque les str2 et tmp sont des références qui pointent vers le même tableau. Donc, quelle que soit l'opération effectuée sur tmp, elle sera effectuée sur la chaîne vers laquelle str2 pointe également.

Si vous voulez qu'il pointe vers un autre tableau, essayez simplement

var tmp = [].concat(str2);
5
gurvinder372 9 mars 2016 à 05:11

Vous devez créer un nouveau point sur la mémoire du tableau:

Array.prototype.clone = function(){
    return JSON.parse(JSON.stringify(this));
};
var arr = [1, 2, 3];
var arr_clone = arr.clone();
arr_clone.reverse();
console.log(arr_clone);
// [3,2,1]
console.log(arr);
// [1,2,3]
0
cbertelegni 10 mars 2016 à 14:42