JavaScript 传递参数是值传递?还是值传递啊?
来源:互联网 发布:淘宝美工怎么接单 编辑:程序博客网 时间:2024/04/29 15:16
据类型。难道引用数据类型传递的时候难道也是值传递吗?答,没错。
引用类型的值是什么东西
当一个变量向另一个变量复制引用类型的值时,会将存储在栈中的值(栈中存放的值是对应堆中的引用地址)复制一份到为新变量分配的空间中。
不同的是,这个值的副本其实是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一个对象。
var admin = user;
admin.name = "xiaoxiaozi";
alert(user.name); //返回 xiaoxiaozi
该过程其实是这样的:
所以说,引用类型的值实际上是对其引用对象的一个指针。
传递的参数
基本类型我们不做讨论,那玩意除了值还真没别的。咱们继续来说引用类型。请看下面试例:
obj.name = "xiaoxiaozi";
}
var person = new Object();
setName(person);
alert(person.name); // 返回 xiaoxiaozi
在向参数传递引用类型值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
ECMAScript 中,所有函数的参数都是按值来传递的。基本类型值的传递和基本类型变量复制一致(采用在栈内新建值),引用类型值的传递和引用类型变量的复制一致(栈内存放的是指针,指向堆中同一对象)
因此在调用函数setName()时,person 被复制给了 obj ,因此在函数内部 obj 与 person 引用的是同一个对象,或者说是对同一个对象的引用。所以在给 obj 引用对象加上 name 属性时,person 引用的对象也有了 name 属性,因为虽然 obj 与 person 不同,但是二者引用的对象是同一个。
但是,千万不要认为,在局部作用域中修改的对象会在全局作用域中反映出来就说参数是按引用传递的。为了证明是值传递,让我们再来看如下例子:
obj.name = "xiaoxiaozi";
obj = new Object();
obj.name = "admin";
}
var person = new Object();
setName(person);
alert(person.name); // 结果依旧是 xiaoxiaozi
在调用 setName() 函数初时,obj 与 person 引用的是同一对象,所以首次的 name 属性赋值会对 person 有所影响。但是当 obj 被重新定义时,其引用的对象已经与 person 不同,所以后面设置的 name 属性,不会对 person 引用的对象有任何影响。
感觉上面的这个例子非常好,大家可以仔细体会一下,我也是看到了这个例子才决定从文中摘抄(貌似没有摘,就是抄)的。
转载---simaopig 发布的博文
- JavaScript 传递参数是值传递?还是值传递啊?
- JS 参数传递到底是值传递还是引用传递?
- Java中参数传递是值传递,还是引用传递
- Java参数传递到底是值传递还是引用传递?
- JavaScript 函数参数传递到底是值传递还是引用传递
- JavaScript 函数参数传递到底是值传递还是引用传递
- JavaScript 函数参数传递到底是值传递还是引用传递
- JavaScript 函数参数传递到底是值传递还是引用传递
- JavaScript 函数参数传递到底是值传递还是引用传递 (精华)
- JavaScript 函数参数传递到底是值传递还是引用传递
- 关于java方法参数是值传递还是地址传递。
- java 方法中参数是值传递还是引用传递
- Java参数传递传递的是值还是引用?
- 传递还是值传递
- java参数传递(值传递还是参数传递)
- java是值传递,还是引用传递?
- java是值传递还是引用传递?
- java是值传递还是引用传递
- 网页切换背景音乐
- 一些常用算法实现
- "未知的服务器标记"以及母板页中的 "不允许循环文件引用" 错误
- 随便写写
- 升级Linux 内核不报 cannot start the X server 的解决方案
- JavaScript 传递参数是值传递?还是值传递啊?
- 第八章 定时器
- (转) Rails 命令大全
- 一篇很好的Win32串口编程文章
- larbin中的robots.txt解析
- iphone UIView draw layer on picture
- 动态链接库和静态链接库的介绍
- C语言字符相关部分内容小结
- sqlserver2008 本地调试配置图解