Javascript ES6/ECMAScript 6解构是否会创建新变量?

Javascript ES6/ECMAScript 6解构是否会创建新变量?,javascript,ecmascript-6,Javascript,Ecmascript 6,如您所知,我们使用分解来使用ES6中对象中的值。我想知道它的深度 当我写下面的代码时: let (or const) { firstVar, secondVar } = this.props 它是在内存中分配新空间还是像指针一样使用这些值 在过去,当我写 let { options } = this.props options.splice(0,20) 我注意到,虽然我的编译器在不同的情况下出现了诸如“props为只读”之类的错误,但props中的变量已经更改。这怎么可能呢?让和常量声明新变

如您所知,我们使用分解来使用ES6中对象中的值。我想知道它的深度

当我写下面的代码时:

let (or const) { firstVar, secondVar } = this.props
它是在内存中分配新空间还是像指针一样使用这些值

在过去,当我写

let { options } = this.props
options.splice(0,20)

我注意到,虽然我的编译器在不同的情况下出现了诸如“props为只读”之类的错误,但props中的变量已经更改。这怎么可能呢?

常量
声明新变量,是的。赋值/初始化后,它们独立于对象属性

当我写
时,让{options}=this.props;options.splice(0,20)
我注意到props中的变量发生了变化


是的,这是因为您的选项是一个数组,并且变量和对象属性都指向同一个可变数组实例

这里的分解和拼接是一种融合

在第二个示例中,
options
将是
this.props
对象上的一个键;打印出
options
时,将使用原始的
this.props.options
对象

所以它是一个参考;按照你的措辞,它是一个指向另一个变量的变量

但是,您也在使用具有副作用的就地/破坏性操作

切片
将返回一个新数组,
拼接
将修改现有数组

如果您不想使用
这个.props.options
,您需要使用:


在Javascript中使用诸如“已分配”或“指针”之类的术语真的毫无意义。对于基本类型,将值复制到变量中,对于对象类型,将复制引用。然而,这也取决于
道具的实现方式;在props中,我在子组件中使用了类似的解构;设{foo}=this.props;foo+=foo+'1addingDummyString';console.log(this.props.foo);但这一次,福没有改变。它的输出是:“dummyString”,而我期望的是“dummyString 1addingDummyString”。为什么?它会返回新的字符串变量吗?据我所知,解构只会深入一个层次。一个字符串基本上是复制的,一个数组不是…好吧,那么什么才是断开链接的正确方法?@Bergi你说的“是的,那是因为你的选项是数组…”是数组,这就是问题的原因。我们可以对引用类型使用析构函数吗?当我使用这个.state.options.slice()时,我得到ESLint error来使用Destructing。[]
let { options } = this.props
options.slice(0, 20) // does not modify the existing array, returns a new array

options.splice(0,20) // modifies the existing array, returns the array of deleted items;