Как вы знаете, мы используем деструктурирование для использования значений в объектах с ES6. Интересно о его глубине.
Когда я напишу код ниже:
let (or const) { firstVar, secondVar } = this.props
выделяет ли он новое пространство в памяти или использует ли эти значения как указатели?
В прошлом, когда я писал
let { options } = this.props
options.splice(0,20)
Я заметил, что переменная в реквизитах изменилась, хотя у моего компилятора были ошибки, такие как "реквизиты Readonly" в разных случаях. Как это возможно?
let
и const
объявляют новые переменные, да. Они не зависят от свойства объекта после назначения/инициализации.
когда я написал
let { options } = this.props; options.splice(0,20)
let { options } = this.props; options.splice(0,20)
Я заметил, что переменная в реквизитах изменилась
Да, это потому, что ваши параметры представляют собой массив, и как переменная, так и свойство объекта указывают на тот же экземпляр изменяемого массива. Присвоение не копировало его содержимое.
Здесь есть стыковка между деструктурированием и сращиванием.
Destructuring свяжет переменную со значением, содержащимся в объекте, из которого он разрушает.
Во втором примере 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;
props
.