JavaScript对象参数的引用传递

今天碰到一个问题,怎样把参数变更影响到函数外部,如:

<script>
  var myname = "wood";
  A(myname);
  document.write(myname);

  function A(n) {
    n = "Yao";
  }
</script>

输出结果还是wood,说明当myname传入A函数后,在函数体内,相当于有一个myname的副本,这个副本的值等于myname,之后在函数体内对其做的操作是在这个副本上进行的。

但情况有所不同,当传入的参数是 数组 、 对象 时,在函数体内对参数所做的更改会反映到原变量上。

<script>
  var myname = ["wood"];
  A(myname);
  document.write(myname[0]);

  function A(n) {
    n[0] = "Yao";
  }
</script>

可以看出,上面代码中已经把friut数组的第一个元素更改了。

下面是关于对象的例子:

<script>
  var myname = {name1:"wood"};
  A(myname);
  document.write(myname.name1);

  function A(n) {
    n.name1 = "Yao";
  }
</script>

可以很明显地看到函数体内对参数的改动影响到了原来的变量,这与通常情况下的传参有质的区别了。需要特别注意。

But,当在函数体内对传入的数组或对象赋值时,这个更改不会反映到函数体外的原变量身上!

请看:

<script>
  var myname = {name1:"wood"};
  A(myname);
  document.write(myname.name1);

  function A(n) {
    n = {name1:"Yao"};
  }
</script>

按照上面函数内部的更改会反映到原变量的理论,你肯定觉得执行完A()后myname变量的name1属性的值已经变成'Yao'了吧。但结果让人有点难以接受。

原因在于,当在函数体内使用赋值操作时,系统就创建了一个变量名为p的变量。这个p是函数内部的变量,对它进行赋值当然只在函数体内起作用,外面的myname还是原来的myname。

这一步与原来代码的操作差别仅在于在 函数体内是对参数赋新值呢还是对参数的属性或数组的元素进行更改 。

下面我们用传递对象的方式,重新实现一个时钟数字格式化输出的例子:

<script>
  var mytime = self.setInterval(function() {
    getTime();
  }, 1000);
  //alert("ok");
  function getTime() {
    var timer = new Date();
    var t = {
        h: timer.getHours(),
        m: timer.getMinutes(),
        s: timer.getSeconds()
      }
      //将时间对象t,传入函数checkTime(),直接在checkTime()中改变对象中的值。
      //而无需再去接收返回值再赋值
    checkTime(t);
    document.getElementById("timer").innerHTML = t.h + ":" + t.m + ":" + t.s;
  }

  function checkTime(i) {
    if (i.h < 10) {
      i.h = "0" + i.h;
    }
    if (i.m < 10) {
      i.m = "0" + i.m;
    }
    if (i.s < 10) {
      i.s = "0" + i.s;
    }
  }
</script>

例子使用setInterval()函数定时调用刷新事件,也可以用setTimeout()在getTime()中递归调用来实现。

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

(0)

相关推荐

  • js中判断Object、Array、Function等引用类型对象是否相等

    在迭代中,我们还要注意的是,对象或者数组中的元素可能是一个任意值--除了原始类型值.object.arrray外,这个值还可能是一个方法.一个DOM对象或者window对象,可能你已经注意到了,有部分引用类型是不能进行迭代的,需要分支判断,代码如下: 复制代码 代码如下: function compare(a,b){ var pt = /undefined|number|string|boolean/, fn = /^(function\s*)(\w*\b)/, cr = "constructo

  • JS模拟面向对象全解(二、类型与赋值)

    类型赋值类似变量传递的问题. 基本数据类型不必说,传值的. 复制代码 代码如下: var a=5; var b=a; b=3; alert(a);//提示5 alert(b);//提示3 由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系. 对象类型,传址的. 复制代码 代码如下: var a=new Object(); a.x=5; var b=a; b.x=3; alert(a.x);//提示3 alert(b.x);//提示3 这样,由于传址,所以b即是a,a即

  • javascript原始值和对象引用实例分析

    本文实例讲述了javascript原始值和对象引用的方法.分享给大家供大家参考.具体分析如下: 一句话来说:原始值是不可变的,而对象引用是可变的. js中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着本质的区别.原始值是不可更改的,任何方法都无法更改一个原始值:对于字符串来说,字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值: var str="hello world"; s.toUpperCase(); s;

  • Javascript delete 引用类型对象

    如下面例子: 复制代码 代码如下: var testVar = {            a : {                test : 1            }        },            test1 = {},            test2 = {}; test1.a = testVar.a;        test2.a = testVar.a;/*        delete test1.a;        console.log(test1.a); //

  • JavaScript对象引用与赋值实例详解

    本文实例讲述了JavaScript对象引用与赋值.分享给大家供大家参考,具体如下: <script type="text/javascript"> //例子一: 引用 var myArrayRef = new Array(0,1,2); //创建数组对象 var mySeconArrayRef = myArrayRef; // 对象复制. myArrayRef[0] = 100; // 修改元素值 alert(mySeconArrayRef[0]); /** * 输出 10

  • JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

  • javascript引用对象的方法

    <a id="link1" name="link1" href="http://bbs.51js.com/">51js</a> ============= 同一页面内的引用方法: 1.使用id: link1.href 2.使用name: document.all.link1.href 3.使用sourseIndex: document.all(4).href //注意,前面还有HTML.HEAD.TITLE和BODY,所以

  • javascript引用对象的方法代码

    同一页面内的引用方法: 1.使用id: link1.href 2.使用name: document.all.link1.href 3.使用sourseIndex: document.all(4).href //注意,前面还有HTML.HEAD.TITLE和BODY,所以是4 4.使用链接集合: document.anchors(0).href //全部的集合有all.anchors.applets.areas.attributes.behaviorUrns.bookmarks. boundEle

  • 浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号

    1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

  • JavaScript数组对象赋值用法实例

    本文实例讲述了JavaScript数组对象赋值用法.分享给大家供大家参考.具体如下: 这里JavaScript数组对象的使用会使你的JS程序变得简洁而有效率,但是好像不少新手都不喜欢用数组,因为觉得它们抽象,不好理解,其实只要你认真领悟,它就像捅破窗户纸一样,令你豁然开朗.希望通过本实例,你对数组会有更多的理解. 运行效果图如下: 具体代码如下: <html> <head> <meta http-equiv="content-type" content=&

随机推荐