ES6 / ECMAScript6解构是否会创建新变量?

时间:2017-09-20 13:24:25

标签: javascript ecmascript-6

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

当我写下面的代码时:

let (or const) { firstVar, secondVar } = this.props

它是在内存中分配新空间还是像指针一样使用这些值?

过去,当我写作

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

我注意到道具中的变量已经改变了,虽然我的编译器有错误,例如道具是Readonly'在不同的情况下。怎么可能呢?

2 个答案:

答案 0 :(得分:5)

letconst声明了新变量,是的。它们在赋值/初始化后独立于object属性。

  

当我写let { options } = this.props; options.splice(0,20)时,我注意到道具中的变量已经改变了

是的,那是因为你的选项是一个数组,变量和object属性都指向同一个可变数组实例。 Assignment did not copy its contents

答案 1 :(得分:2)

destructuring splice 之间存在混淆。

Destructuring will bind a variable to the value contained within the object it is destructuring from.

在第二个示例中,options将成为this.props对象的关键字;当您打印options时,将使用原始this.props.options对象。

所以它是一个参考;就你所说的那样,它是一个指向另一个变量的变量。

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

slice 会返回一个新数组, splice 会修改现有数组。

如果您想单独离开this.props.options,则需要使用slice

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;