为什么会这样? (javaScript的逆向法)

Why is this happening? (javaScript's reverse method)

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 的指针,当我在 tmp 上调用 reverse() 时,它实际上反转了 str2。

即使这真的是正在发生的事情,我仍然觉得这是一种非常违反直觉的语言工作方式。

My question is why str2 is being changed even though it is not being reversed?

因为 str2tmp 是指向同一个数组的引用。因此,对 tmp 执行的任何操作都将对 str2 也指向的字符串执行。

如果你想让它指向另一个数组,那么只需尝试

var tmp = [].concat(str2);

你猜对了。

tmp 只是指向原始 str2 的指针,因此无论对 str2 执行什么操作,它都会存储到内存中,当您访问 tmp 时,它会找到对 str2 的引用。

I have a guess as to why this is happening. The tmp is just a pointer to the original str2, and when I call reverse() on tmp, it actually reverses str2.

2 发生这种情况的原因:

  • reverse()方法在位置反转数组,因此tmp反转:ref
  • 变量tmpstr2是对同一个数组实例的引用,因此str2也颠倒了。

您需要在数组的内存上创建一个新点:

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]