var a = 2; var b = a; //b 是 a 的值的一个副本 b++; a; //2 b; //3 var c = [1, 2, 3]; var d = c; // d 是 值[1, 2, 3]的一个引用 d.push(4); c; // [1, 2, 3, 4] d; // [1, 2, 3, 4] d = [4, 5, 6]; // console.log(c); // console.log(d); // 基本类型值( 包括 null、undefined、字符串、数字、布尔和 ES6中的 symbol )都是通过值复制来传递/赋值,而对象(包括数组和封装对象)则是通过引用复制的方式来传递/赋值。 // 由于引用指向的是值本身而非变量, 刚开始c、d 都指向值[1, 2, 3],请注意它们仅仅是指向值,并不是持有,当其中一个对值进行更改(如 .push(4)), // 另外一个指向的就是更改后的新值[1, 2, 3, 4],所以一个引用无法改变另一个引用的指向。故当其中一个引用指向了其他值(如 = [4, 5, 6]),另一个引用的指向值不会变, // 还是 [1, 2, 3, 4] (除非 d 不是指向数组的引用,而是指向 c 的指针,但在 JavaScript 中不存在这种情况)。 function foo(x) { x.push(5); x; // [1, 2, 3, 4, 5] x = [5, 6]; x.push(7); x; // [5, 6, 7] } foo(c); c; // [1, 2, 3, 4, 5]
作者:狂流
出处:http://www.cnblogs.com/kuangliu/
欢迎转载,分享快乐! 如果觉得这篇文章对你有用,请抖抖小手,推荐一下!