关于变量赋值的小问题

2017-03-10 13:59:19 +08:00
 lxy
var index = {
    data: 10
};
function par() {
    function fun(i) {
        index = 15;
        console.log(i.data + ' ' + index);
    }
    fun(index);
}
par();
console.log(index);

输出 10 15\n15

问题是,在 fun 内部不是已经改变全局变量 index 的值了吗,为什么 i.data 还能输出原来的值?

1585 次点击
所在节点    JavaScript
5 条回复
chairuosen
2017-03-10 14:24:03 +08:00
赋值 15 改变的是变量 index 这个指针,原来的对象还在, fun(index)是把 index 变量指向的对象传进去。
SuperMild
2017-03-10 15:56:44 +08:00
注意执行顺序,在改变 index 之前,已经先执行了 i = index
LeeSeoung
2017-03-10 17:23:30 +08:00
此 index 非彼 index
lslqtz
2017-03-10 19:59:26 +08:00
因为 i != index
denano
2017-03-15 11:34:53 +08:00
js 函数传参永远都是值传递,如果参数是对象的话,传的是对象引用的内存地址。
你的问题里 i 指向的是一开始 index 的内存地址,后面执行的 index=15 让 index 指向了新的地址,但是 i 还是指向最初的地址。
如果 index=15 改成 index.data=15 的话,那么 i 会跟着一起变。

参考 http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value

Javascript is always pass by value, but when a variable refers to an object (including arrays), the "value" is a reference to the object.

Changing the value of a variable never changes the underlying primitive or object, it just points the variable to a new primitive or object.

However, changing a property of an object referenced by a variable does change the underlying object.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX