JavaScript传递变量: 值传递?引用传递?_Javascript教程-查字典教程网
JavaScript传递变量: 值传递?引用传递?
JavaScript传递变量: 值传递?引用传递?
发布时间:2016-12-30 来源:查字典编辑
摘要:当变量A赋值给变量B时,会将栈中的值复制一份到为新变量分配的空间中。如何理解?复制代码代码如下:varx=y=1;y=2;alert(x);...

当变量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的传递是按值传递。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类