A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任文杰 中级黑马   /  2012-7-25 18:58  /  2465 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天,看了毕向东老师的JavaScript视频,有个疑问想请教下大家,下面是代码:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title>Insert title here</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9.         var x = [1,2,3];
  10.         function show(x) {
  11.                 x = [4,5,6];
  12.         }
  13.     show(x);
  14.     document.write("x=="+x);//x==1,2,3
  15.        
  16. </script>
  17. </body>
  18. </html>
复制代码
在JavaScript中,数组是对象,为什么将引用传递给参数,没有把实体的值改变,还是输出1,2,3而不是4,5,6

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 刘玉 于 2012-7-25 21:00 编辑

js中数组、对象等按值(变量地址的值)传递,当你的x进入函数后,它的地址跟外边的地址是一样的,但是当你重新赋值时,它的地址就跟外面的断了。解决这个问题有两个方法:
1.show()不要传x进去
  function show() {
              x = [4,5,6];
   }
2.传x进去但别重新赋值,直接操作它
  function show(x) {
    x[0]=4;
    x[1]=5;
    x[2]=6;
  }
回复 使用道具 举报
function show(x) {

11.                x = [4,5,6];

12.        }
你定义了一个方法,赋值x=[4,5,6];
但是并没有返回值。虽然调用了show()方法,在只是在show()方法里面有效,所以改成
function show(x) {
                x = [4,5,6];
return x;
        }
        var x = [1,2,3];     
var b=show(x);  
    document.write("b=="+b);//x==4,5,6
要么你就在show()方法里面写出来
function show(x) {
                x = [4,5,6];
document.write("x=="+x);
        }
        var x = [1,2,3];
show(x);
回复 使用道具 举报
function show(x) {

11.                x = [4,5,6];

12.        }
你定义了一个方法,赋值x=[4,5,6];
但是并没有返回值。虽然调用了show()方法,在只是在show()方法里面有效,所以改成
function show(x) {
                x = [4,5,6];
return x;
        }
        var x = [1,2,3];     
var b=show(x);  
    document.write("b=="+b);//x==4,5,6
要么你就在show()方法里面写出来
function show(x) {
                x = [4,5,6];
document.write("x=="+x);
        }
        var x = [1,2,3];
show(x);
回复 使用道具 举报
  1. <!-- saved from url=(0013)about:internet -->
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Insert title here</title>
  7. </head>
  8. <body>
  9. <script type="text/javascript">
  10.         var x = [1,2,3];
  11.         function show(x) {
  12.                 x = [4,5,6];
  13.                                 //需要返回值!按照楼主那么写,写入的就是x原本的值,函数内的值时变的
  14.                                 //你可以alert(x);输出一下就知道了
  15.                                 return x;
  16.         }
  17.    document.write("x=="+show(x));//x==1,2,3
  18.         
  19. </script>
  20. </body>
  21. </html>
复制代码
小结:楼主,对于js这种火星java,你不必练习到像java那么熟练,只需要知道它里面几个常用的方法,知道它具体的格式,你会看就行。js中的对象完全是用函数模拟出来的,所以它叫基于对象,很雷人的火星java。一点小建议,咱们共同努力!加油,楼主!
回复 使用道具 举报
刘玉 发表于 2012-7-25 20:44
js中数组、对象等按值(变量地址的值)传递,当你的x进入函数后,它的地址跟外边的地址是一样的,但是当你重新 ...

用这么复杂吗?楼主很明显是输出的时候写错了
回复 使用道具 举报
刘玉 中级黑马 2012-7-25 21:29:04
7#
本帖最后由 刘玉 于 2012-7-25 21:33 编辑
吴立杰 发表于 2012-7-25 21:23
用这么复杂吗?楼主很明显是输出的时候写错了

测试一下就知道了:P,重点是“JavaScript参数传递与Java的区别
回复 使用道具 举报
刘玉 发表于 2012-7-25 21:29
测试一下就知道了,重点是“JavaScript参数传递与Java的区别”

有什么区别?javascript都是模拟出来的对象,跟java一样的,就是传递在传递对象的时候如果你的形参写的是Object 你传递进去的实参就变成了Object了也就多态那点玩意。javascript里没有多态的概念,连个类继承都是模拟出来的,用一个叫获取原型的方法,不用想那么复杂。
回复 使用道具 举报
刘玉 中级黑马 2012-7-25 23:15:31
9#
吴立杰 发表于 2012-7-25 21:57
有什么区别?javascript都是模拟出来的对象,跟java一样的,就是传递在传递对象的时候如果你的形参写的是 ...

调试一下楼主的代码看看方法里外的x的值是否一样不就清楚了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马