使用let解构赋值后,修改变量为何不影响原SignUpDto对象属性?
问题原因解析
这是JavaScript/TypeScript解构赋值的基础特性,和NestJS本身无关。
解构赋值的本质
你执行let { name, email, password } = signUpDto;时,本质上等价于:
let name = signUpDto.name; let email = signUpDto.email; let password = signUpDto.password;
也就是把signUpDto对象里的字符串(原始类型)值复制了一份,赋值给了全新的独立变量。这些变量和原对象的属性分属不同内存空间,修改变量的值只会改变这个副本,完全不会影响原对象的对应属性。
原始类型的赋值规则
JavaScript里的原始类型(字符串、数字、布尔等)采用值传递:赋值时会复制一份值给新变量,两个变量互不干扰。只有引用类型(对象、数组)才会传递引用,但你这里解构的是对象内的原始类型属性,所以依然是值复制逻辑。
同步修改原对象的正确方式
如果要让修改同步到signUpDto,直接操作原对象的属性即可:
// 替换解构后修改变量的写法,直接修改原对象 signUpDto.name = 'new name';
关于你的猜测
你的猜测完全正确:变量和原对象属性确实存储在不同内存位置。原始类型的值存于栈内存,解构时复制了栈内的值到新变量,修改新变量只会改变自身栈内的内容,原对象属性仍指向最初的栈值。
内容的提问来源于stack exchange,提问作者Ramsey
相关产品推荐
相关产品推荐

