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