1.
var a = 1;
var b = a;
a = 2;
console.log(b); // 1
var c = [1,2,3];
var d = c;
c.shift();
console.log(d); // [2,3]
我们知道基本对象的赋值是拷贝值,所以改变a不影响b,复杂对象赋值拷贝的是指针,所以改变c影响d
2.
但是现在有一些奇怪的现象
var a = [1,2,3];
var b = a;
a = [1,2,3,4];
console.log(b); // [1,2,3]
在这里改变了a 但是b没有改变,并不知道这中间发生了什么,难道又开辟了一个地址a存放[1,2,3,4]?b还是指向之前的a?
3.
var factorial = function() {
return 1
};
var trueFactorial = factorial;
factorial = function () {
return 2;
}
console.log(trueFactorial()); // 1
哎 奇怪了,不是对factorial 重新赋值了吗?function的赋值不是浅拷贝吗?
4.
var factorial = function() {
return factorial();
};
var trueFactorial = factorial;
factorial = function () {
return 2;
}
console.log(trueFactorial()); // 2
哎 在这里能正常调用到第二次赋值的那个函数
2,
a = [1,2,3,4];
创建了一个新的数组对象,然后把a
指向它3,
var trueFactorial = factorial;
把factorial
指向的对象赋值给trueFactorial
,所以trueFactorial
指向的是最初声明的方法