JavaScript传递变量: 值传递?引用传递?
2011-02-22 21:19
471 查看
当变量A赋值给变量B时,会将栈中的值复制一份到为新变量分配的空间中。
如何理解?
复制代码 代码如下:
var x = y = 1;
y = 2;
alert(x);
x的值为多少?
复制代码 代码如下:
var obj = {};
var sub = {};
sub['id'] = 3;
obj['sub'] = sub;
sub['id'] = 4;
alert(obj['sub']['id']);
obj['sub']['id']的值又为多少?他们真的符合你的预期吗?
我们分别运行2段代码,发现第1段程序中x的值没有改变,而第2段程序中的obj['sub']['id']的值却改变了。同样是一个赋值操作,同样是修改另外一份拷贝的值,为什么一段程序源变量没变,一段程序源变量变化了呢?这个传递到底是按值传递还是按引用传递的呢?
李松峰翻译的《JavaScript 高级程序设计 第二版》中给出了答案。
在开始的这2个例子中,事实上都复制了A的值给B,不同的是,在第一个例子中,A的值是int型的1,而在第二个例子中,A的值是一个地址指针,这个地址指针可以访问到一个对象,复制之后,第1个例子中的B的值变成了新的int, 他的值为1,而第2个例子中B的值变成了新的地址指针,他的值为这个对象的地址。
下面的例子可以帮助理解
复制代码 代码如下:
function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);
可以看到的是,尽管调用了setName函数修改了变量的name属性,但是person.name的值并没有改变。这是因为在函数中,obj指向的地址被改变了,因此修改这个地址的name属性,并不会对原地址的name属性造成影响。从另一个方面,也印证了JavaScript的传递是按值传递。
如何理解?
复制代码 代码如下:
var x = y = 1;
y = 2;
alert(x);
x的值为多少?
复制代码 代码如下:
var obj = {};
var sub = {};
sub['id'] = 3;
obj['sub'] = sub;
sub['id'] = 4;
alert(obj['sub']['id']);
obj['sub']['id']的值又为多少?他们真的符合你的预期吗?
我们分别运行2段代码,发现第1段程序中x的值没有改变,而第2段程序中的obj['sub']['id']的值却改变了。同样是一个赋值操作,同样是修改另外一份拷贝的值,为什么一段程序源变量没变,一段程序源变量变化了呢?这个传递到底是按值传递还是按引用传递的呢?
李松峰翻译的《JavaScript 高级程序设计 第二版》中给出了答案。
在开始的这2个例子中,事实上都复制了A的值给B,不同的是,在第一个例子中,A的值是int型的1,而在第二个例子中,A的值是一个地址指针,这个地址指针可以访问到一个对象,复制之后,第1个例子中的B的值变成了新的int, 他的值为1,而第2个例子中B的值变成了新的地址指针,他的值为这个对象的地址。
下面的例子可以帮助理解
复制代码 代码如下:
function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);
可以看到的是,尽管调用了setName函数修改了变量的name属性,但是person.name的值并没有改变。这是因为在函数中,obj指向的地址被改变了,因此修改这个地址的name属性,并不会对原地址的name属性造成影响。从另一个方面,也印证了JavaScript的传递是按值传递。
您可能感兴趣的文章:
相关文章推荐
- JavaScript传递变量:值传递?引用传递?
- JavaScript传递变量: 值传递?引用传递?
- 传递变量名,传递指针,传递引用
- 第2章 Java编程基础——FAQ2.14 变量之间传值时可分为值传递和引用传递, 那么它们有何区别?
- JavaScript中函数参数的值传递和引用传递
- JavaScript 引用c#控件变量 同 隐藏自定义控件提示
- javascript的正则如何传递一个变量
- c# out ref 引用传递,借用变量返回多个值
- vbscript与javascript传递变量
- JavaScript中几种常用的解决for循环中引用同一循环变量对象的方法
- 用ASP.NET向Javascript传递变量
- 论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用
- 一个简单的问题:在Django中如何将views.py中的变量传递到HTML/JavaScript中?
- JavaScript中函数参数的值传递和引用传递
- 浅谈Asp.net多层架构中的变量引用与传递
- JavaScript的闭包问题(闭包解决引用循环变量的问题)
- 临时变量作为非const的引用进行参数传递引发的编译错误
- Effective JavaScript Item 24 使用一个变量来保存arguments的引用
- JavaScript中函数参数的值传递和引用传递
- javascript的字符串按引用复制和传递,按值来比较介绍与应用