码迷,mamicode.com
首页 > Web开发 > 详细

js参数传递

时间:2016-07-07 00:56:36      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

概述:js中的参数传递有两种方式,对于基本数据类型而言是按照值传递的,而对于对象而言是按照共享传递的(调用函数传参时,函数接受对象实参引用的副本,既不是按值传递的对象副本,也不是按引用传递的隐式引用。它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值)

可以通过如下代码证明js中基本数据类型是按照值传递的:code-1

var tmp=0;
function change(data){
data=‘hello‘;
}
change(tmp);
console.log(tmp);

这段代码输出为0;很明显形参是实参值的一份拷贝而已。

 

至于js中对象是按照共享传递的可以通过下面这段代码来说明:code-2

var obj = {x: 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.这说明js参数不是按照引用传递的(如果是按照引用传递则obj就被改为数值对象

如果js对象参数是按照引用传递的则上述代码中的obj对象就会被赋值为100(基本数据类型),可是上述代码输出为1,这说明obj仍然是一个对象(并没有变为一个基本数据类型),可见js中的对象参数不是按照引用传递的;

再来看一段代码:code-3

var obj = {x: 1};
function foo(o) {
o.x = 100;
}
foo(obj);
console.log(obj.x); //输出为100

这就让人有点迷惑了,不是说js对象参数不是按照引用传递的吗?为什么在函数内部可以改变对象的属性呢?其实这个主要是因为js对象是按照共享传递的,即形参是对象实参引用的副本,实参引用和形参(实参引用的副本)都指向同一个对象,所以可以通过实参引用副本来改变对象的属性,但是改变形参本身并不会对实参指向的对象有任何影响(这也就是为什么code-2的输出为1)

js参数传递

标签:

原文地址:http://www.cnblogs.com/simple-stupid/p/5648394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!