Javascript 对象的对象作为函数参数

Javascript 对象的对象作为函数参数,javascript,Javascript,正如您可以从我的代码示例中看到的,我想知道为什么下面的事情不起作用。 我有一个对象,对象作为属性(在下面的文本中将其称为prop)。 当我在函数中将值赋给prop时,这些值就在那里,因为它显然是通过引用传递的,但我不理解为什么可以引用prop来指向另一个对象 在将道具设置为另一个对象的情况下,我只会得到空对象,因为它在start中。 我错过了什么 const person = { basic: {} } function initPersonBasics(b) { // doesn'

正如您可以从我的代码示例中看到的,我想知道为什么下面的事情不起作用。 我有一个对象,对象作为属性(在下面的文本中将其称为prop)。 当我在函数中将值赋给prop时,这些值就在那里,因为它显然是通过引用传递的,但我不理解为什么可以引用prop来指向另一个对象

在将道具设置为另一个对象的情况下,我只会得到空对象,因为它在start中。 我错过了什么

const person = {
  basic: {}
}


function initPersonBasics(b) {
  // doesn't work
  b = {
    firstName: 'John',
    lastName: 'Doe'
  }

  // works
  // b.firstName = 'John';
  // b.lastName = 'Doe';
}




initPersonBasics(person.basic);
console.log(person);
const person={
基本:{}
}
函数initPersonBasics(b){
b={
名字:“约翰”,
姓:“Doe”
};
控制台日志(b);
}
initPersonBasics(person.basic);
控制台日志(个人)
const person={
基本:{}
}
函数initPersonBasics(b){
b={
名字:“约翰”,
姓:“Doe”
};
控制台日志(b);
}
initPersonBasics(person.basic);

控制台日志(个人)
initPersonBasics()
函数中,参数
b
的行为类似于局部变量。当函数启动时,它已经用函数的第一个参数(
person.basic
)的值初始化

但是声明

b = {
    firstName: 'John',
    lastName: 'Doe'
}
将不同的值放入
b
;它不会以任何方式改变
person.basic

如前所述,如果不将新对象分配给
b
并设置
b.firstName
b.lastName
,则值存储在
person.basic
中。这是因为JavaScript分配不复制对象,而是存储对它们的引用

有几种方法可以让它按您的意愿工作。您已经发现了其中一个:在执行函数调用期间,将值逐个存储在
b
(它是
person.basic
的别名)的属性中

另一种选择是使用:

请注意,它在较旧的浏览器中不起作用(甚至在一些较新的浏览器中也不起作用)。仔细检查该部分

另一个选项(适用于所有浏览器)是,但其语法更详细:

function initPersonBasics(b) {
    Object.defineProperties(b, {
        firstName: {
            value: 'John',
            writable: true,
        },
        lastName: {
            value: 'Doe',
            writable: true,
        }
    });
}

请注意,如果没有为属性提及
writeable:true
,则该属性将变为只读且无法分配给(并且不会报告错误)。

initPersonBasics()
函数中,参数
b
的行为类似于局部变量。当函数启动时,它已经用函数的第一个参数(
person.basic
)的值初始化

但是声明

b = {
    firstName: 'John',
    lastName: 'Doe'
}
将不同的值放入
b
;它不会以任何方式改变
person.basic

如前所述,如果不将新对象分配给
b
并设置
b.firstName
b.lastName
,则值存储在
person.basic
中。这是因为JavaScript分配不复制对象,而是存储对它们的引用

有几种方法可以让它按您的意愿工作。您已经发现了其中一个:在执行函数调用期间,将值逐个存储在
b
(它是
person.basic
的别名)的属性中

另一种选择是使用:

请注意,它在较旧的浏览器中不起作用(甚至在一些较新的浏览器中也不起作用)。仔细检查该部分

另一个选项(适用于所有浏览器)是,但其语法更详细:

function initPersonBasics(b) {
    Object.defineProperties(b, {
        firstName: {
            value: 'John',
            writable: true,
        },
        lastName: {
            value: 'Doe',
            writable: true,
        }
    });
}

请注意,如果您没有提及属性的
writable:true
,它将成为只读的,并且无法分配给(并且不会报告错误)。

我当然不会,但我想我现在明白了。“基本”对象指向某个地方的事实意味着我可以改变它的值,而不是它完全指向的地方。类似于c中的指针。谢谢我当然不会,但我想我现在明白了。“基本”对象指向某个地方的事实意味着我可以改变它的值,而不是它完全指向的地方。类似于c中的指针。谢谢