Почему это происходит? (обратный метод javaScript)
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']
Мой вопрос: почему str2 изменяется, даже если он не отменяется?
Это очень расстраивает меня, но я догадываюсь, почему это происходит. Tmp - это просто указатель на исходный str2, и когда я вызываю reverse() на tmp, он фактически меняет str2.
Даже если это действительно то, что происходит, я все еще чувствую, что это очень противоречивый способ работы с языком.
Ответы
Ответ 1
Ваша догадка правильная.
tmp - это просто указатель на исходный str2, поэтому любые операции, выполняемые на str2, будут сохранены в памяти, а при доступе к tmp он найдет ссылку на str2.
У меня есть предположение, почему это происходит. Tmp - это просто указатель к исходной str2, и когда я вызываю reverse() на tmp, это на самом деле меняет str2.
Ответ 2
2 Причины, по которым это происходит:
- Метод
reverse()
меняет массив на месте, поэтому tmp
меняет направление: ref
- Переменные
tmp
и str2
являются ссылками на один и тот же экземпляр массива, поэтому str2
также отменяется.
Ответ 3
Мой вопрос: почему str2 меняется, хотя он не является вспять?
Так как str2
и tmp
являются ссылками, которые указывают на один и тот же массив. Таким образом, любая операция, выполняемая в tmp
, будет выполняться в строке, к которой также указывает str2
.
Если вы хотите, чтобы он указывал на другой массив, просто попробуйте
var tmp = [].concat(str2);
Ответ 4
Вам нужно создать новую точку в памяти массива:
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]