var foo = 1,
bar = foo;
bar = 9;
console.log(foo, bar); // => 1, 9
var foo = [1, 2],
bar = foo;
bar[0] = 9;
console.log(foo[0], bar[0]); // => 9, 9
var foo = [1, 2],
foo = bar;
bar[0] = 9;
console.log(foo[0], bar[0]); // => 9, 9
第二、三中为什么会输出9,9?
理解这个区别的关键就是理解
bar = 9
和bar[0] = 9
的区别。先说
bar = 9
,这等于是说:将一个对象(数字 9)赋值给变量bar
。在此之前,bar
和foo
都是指向数字 1 的引用,但是bar = 9
这一句等于重写了bar
的指向。所以foo
是 1,bar
是 9。再说
bar[0] = 9
,首先bar
和foo
一样都是数组 [1, 2] 的引用(换言之,它们指向的是同一个数组对象),那么bar[0] = 9
并没有改变bar
本身的指向,而是把它所指向的数组的第一个元素改成 9。即使数组里的第一个元素的值改变了,bar
和foo
依然还是指向这同一个数组。所以foo[0]
是 9,bar[0]
也是 9。