Javascript 为什么不是';这个对象不是被覆盖了吗?

Javascript 为什么不是';这个对象不是被覆盖了吗?,javascript,Javascript,这两个简单的例子向我解释了javascript中的对象。我理解第一个示例,但我无法理解的是,为什么第二个(非常相似)示例中的o没有被空对象覆盖 function foo(obj) { obj.x = 7; } var o = {x: 5}; foo(o); console.log(o.x); // 7 在我看来,在以下示例中,应该记录未定义: function foo(obj){ obj = {}; } var o = {x: 5}; foo(o); console.log(o.

这两个简单的例子向我解释了javascript中的对象。我理解第一个示例,但我无法理解的是,为什么第二个(非常相似)示例中的
o
没有被空对象覆盖

function foo(obj) {
    obj.x = 7;
}
var o = {x: 5};
foo(o);
console.log(o.x); // 7
在我看来,在以下示例中,应该记录未定义:

function foo(obj){
   obj = {};
}
var o = {x: 5};
foo(o);
console.log(o.x); // 5

但事实并非如此,为什么?这两个示例之间的区别是什么,导致第二个示例中的
o
不会被覆盖?

参数
obj
o
的一个单独变量。调用函数时,它接收
p
值的副本。更改
obj
的值对
o
没有影响


JavaScript纯粹是一种传递值语言。不可能为JavaScript变量创建别名,因此被调用函数无法在调用环境中修改变量的值。

在函数foo中,当您设置
obj={}
时,您正在更改
obj
引用的引用。但是您没有更改引用的内容。

在这两个示例中,您将引用的副本传递给对象,而不是对象本身

在示例1中,您可以更改对象中的某些内容,很好 在示例2中,在函数内更改引用本身,它现在指向的不是原始对象,在函数外,引用仍然相同


这是passby value v pass by reference

,但据我所知,javascript通过引用(或者更具体地说,是对对象的引用)将对象分配给变量。这就是第一个例子起作用的原因。但这是否也意味着在第二个示例中,对象将被覆盖?@DrMister no.
o
的值实际上是对对象的引用。调用函数时,将创建该引用的副本并将其交给函数。修改
obj
会修改该独立变量,并且不会影响
o
的值。