var n = 123, a, b = [], c = {}; a = n; // 复制数字123 b[0] = n;// 复制数字123 c.x = n;// 复制数字123 (a == b[0]) && (a == c.x) && (b[0] == c.x) && alert("复制的值都是相等的");// 检测它们的值都是相等的在上面示例中,分别把值123复制3份给变量a、数组b和对象c,虽然它们的值是相等的,但是它们之间是相互独立的。
var a = 123;// 原来的值 function f(x){ x = x + x; } f(a);// 调用函数修改传递的值 alert(a); // 查看变量a的值是否受影响,返回值为123,说明没有变化3)比较值
var a = [1,2,3];// 赋值数组引用 b = a; // 复制值 b[0] = 4;// 修改变量b中第一个元素的值 alert(a[0]); // 返回4,显示变量a中第一个元素的值也被修改为4但是,如果给变量b重新赋予新值,则新值不会影响原值内容。例如:
var a = [1,2,3];// 赋值数组引用 b = a; // 复制值 b = 4; // 为变量b重写赋值 alert(a[0]); // 变量a的内容保持不变重复赋值实际上是覆盖变量对原值的引用,变为另一个值的副本或对其引用。所以不会对原值产生影响,演示示意图如图4-2所示。
2)传递值
当使用引用将数据传递给函数时,传递给函数的也是对原值的一个引用,函数可以使用这个引用来修改原值本身,任何修改在函数外部都是可见的。例如:
var a = [1,2,3]; function f(x){ x[0] = 4; // 在函数中修改参数值 } f(a); // 传递引用值 alert(a[0]);// 返回4,原值发生变化请注意,在函数内修改的是对外部对象或数组的引用,而不是对象或数组本身的值。在函数内可以使用引用来修改对象的属性或数组的元素,但是如果在函数内部使用一个新的引用覆盖原来的引用,那么在函数内部的修改就不会影响原引用的值,函数外部也是看不到的。
var a = [1,2,3]; function f(x){ x = 4;// 在函数中修改参数值 } f(a); // 传递引用值 alert(a[0]);// 返回1,原值不会发生变化3)比较值
var a = new Number(1);// 引用值a var b = new Number(1);// 引用值b var c = a;// 把a的引用赋值给c alert(a==b); // 返回false alert(a==c); // 返回true所以,{} == {},[] == [],都返回false。因为引用地址不同。
var s = "abc"; // 字符串,值类型数据 var o = new String(s); // 字符串对象,被装箱后的字符串 function f(v){ // 运算函数 v.toString = function(){// 修改参数的方法toString() return 123; }; } f(s);// 传入值 alert(s);// 返回字符串"abc",说明运算没有对原数据造成影响 f(o);// 传入引用 alert(o);// 返回数值123,说明运算已经影响到原数据的内部结构值类型是以实际值参与运算的,因此与原数据没有直接联系。而引用型以引用地址参与运算,计算的结果会影响到引用地址所关联的堆区数据块。但是,有一点例外,对于JavaScript的字符串来说,它的操作方法就比较复杂,详情请google!