let变量赋值差异疑问:直接赋值与扩展运算符赋值为何结果不同?
问题解答
两种赋值的差异跟let无关,核心是对象的引用传递与浅拷贝的区别:
- 当你写
let s = validate;时,这是引用赋值:s和validate指向内存中同一个对象。此时对s的属性操作(比如delete s['location']),本质是直接修改那个共享的对象,所以validate.location也会变成undefined。 - 当你写
let s = { ...validate };时,这是浅拷贝:扩展运算符会把validate的所有可枚举属性复制到一个新的空对象里,s是一个独立的新对象,和原validate没有关联。此时删s的属性只会影响s自己,原validate不受任何影响。
哪怕把let换成var或const,两种赋值方式的结果也完全一样——差异的根源是对象的传递机制,和变量声明关键字无关。
内容的提问来源于stack exchange,提问作者Berke Türk
相关产品推荐
相关产品推荐

