Подтвердить что ты не робот

Почему это происходит? (обратный метод 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.

Даже если это действительно то, что происходит, я все еще чувствую, что это очень противоречивый способ работы с языком.

4b9b3361

Ответ 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]