您好,欢迎访问一九零五行业门户网

深入理解JavaScript中的传值与传引用_javascript技巧

1.传值(by value)
变量的值被复制出一份,与原来的值将不相干,也就是说即使新的值被修改,原来的值也不会改变,在javascript中基本类型都是传值的.
复制代码 代码如下:
function testpassvalue()
{
   var m=1;
   var n=2;
   //将m,n的值复制一份,传递到passvalue
   passvalue(m,n);
   alert(m);  //将是原有的值
}
function passvalue(a,b)
{
  a = a+b; //改变a的值,这里a只是原有值的一份copy
  alert(a); 
}
输出结果:
31
2.传引用(by reference).
引用本身复制一份传给function,引用指向的对象并没有被复制传递(java中也是如此),在function中,如果改变了对象的属性的值,由于和原来的引用指向的是同一个对象,因此在通过原来的引用访问到的将是修改过的值;
但是如果只是在function中将引用指向一个新的对象,将不会改变原对象的值,改变的只是复制的这一份引用.
复制代码 代码如下:
function testpassvalue()
{
  var date = new date(2006,02,27);
  alert(date.getdate());  //输出为 27
  //将date引用本身复制一份,传递到passreference,注意date所指向的对象并没有被复制
  passreference(date);
  alert(date.getdate());  //输出为12
  //同上
  changereference(date);
  alert(date.getdate());  //输出还为12
}
function passreference(da)
{
 //由于da和原引用指向的是同一个对象,在function外,通过原有的引用访问到的将是对象的日期属性值,将是修改之后的值.
   da.setdate(12);
}
function changereference(da)
{
   //此时da引用实际上是原引用的一份copy,将引用本身重新赋值,将不会影响原引用
   da= new date(2007,05,11); //将da引用指向一个新的对象,此时原引用指向的还是原来的对象
   alert(da.getdate());     // 输出为11
}
3 特殊的string  在javascript中,string也传引用的. js中只有charat方法,而没有对应的修改方法,和java中的string相同,都具有不变性.
复制代码 代码如下:
var s1 = hello;
var s2 = hell + o;
if (s1 == s2)  
alert(s1 = s2);  //这句会不会执行? java用的熟的人可能会认为不会执行(这句话我颇有微词,java中也是会执行的!),因为java中的==比较的是同一性. 事实上在js中对string==比较的是值是否相等,所以这句话会执行. 但是对其他的object == 比较和java中一样是同一性.
其它类似信息

推荐信息