Создает ли деструктуризация ES6 / ECMAScript6 новую переменную?

1

Как вы знаете, мы используем деструктурирование для использования значений в объектах с ES6. Интересно о его глубине.

Когда я напишу код ниже:

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

выделяет ли он новое пространство в памяти или использует ли эти значения как указатели?

В прошлом, когда я писал

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

Я заметил, что переменная в реквизитах изменилась, хотя у моего компилятора были ошибки, такие как "реквизиты Readonly" в разных случаях. Как это возможно?

  • 5
    Использование таких терминов, как «выделенные» или «указатели» в Javascript, на самом деле не имеет смысла. Для примитивных типов значение копируется в переменную, для типов объектов ссылка копируется. Однако это также зависит от способа реализации props .
Теги:
ecmascript-6

2 ответа

3
Лучший ответ

let и const объявляют новые переменные, да. Они не зависят от свойства объекта после назначения/инициализации.

когда я написал let { options } = this.props; options.splice(0,20) let { options } = this.props; options.splice(0,20) Я заметил, что переменная в реквизитах изменилась

Да, это потому, что ваши параметры представляют собой массив, и как переменная, так и свойство объекта указывают на тот же экземпляр изменяемого массива. Присвоение не копировало его содержимое.

  • 0
    Хорошо, так что будет правильным способом сделать это, чтобы разорвать ссылку?
  • 0
    @codemonkey См. вопрос, который я связал в моем ответе
Показать ещё 1 комментарий
1

Здесь есть стыковка между деструктурированием и сращиванием.

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;
  • 0
    Я только что попробовал приведенный ниже код, у меня есть foo = 'dummyString'; в подпорках, и я использовал деструктурирование в дочернем компоненте, как это; let {foo} = this.props; foo + = foo + '1addingDummyString'; console.log (this.props.foo); но на этот раз Фу не изменился. Его вывод: 'dummyString', в то время как я ожидал 'dummyString 1addingDummyString'. Почему ? Возвращает ли новая строковая переменная?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню