Правильный способ переназначения значения переменным, которые были созданы с помощью деструктуризации?(Деструктуризация массива) - PullRequest
0 голосов
/ 31 января 2019

Я только знакомлюсь с деструктуризацией (n00b) и слежу за курсом по мастерам внешнего интерфейса.Это выглядит следующим образом:

let [firstVar, secondVar] = ["firstValue", "secondValue"]

Что имеет смысл.Я могу (и проверил), что firstVar получает значение "firstValue", а secondVar получает значение "secondValue".

Что сбивает с толку, так это то, что я не могу переназначить значения, хранящиеся в этих переменных,Я использовал const и let (как показано выше) и пытался переназначить переменные.Там, где я объявил переменные, используя const, ошибка не выдается.Если я играю в консоли браузера, я получаю что-то вроде этого:

const [firstThing, secondThing] = ["first value", "second value"] 
console.log(firstThing) // expected output: first value
firstThing = "some new thing" 
console.log(firstThing) // expected output: first value

Скриншот этого поведения в консоли FireFox (я перешел к пункту about: blank, чтобы убедиться, что в памяти нет старых переменных): Behavior in firefox console

Опять же, не выдается никакой ошибки (что я обычно ожидаю при попытке переназначить переменную const.

Если я сделаю следующее, я получу поведение, которое я ожидаю:

[firstThing] = ["some new value"]
// TypeError: invalid assignment to const 'firstThing'

Когда деструктурирование выполнено с использованием let, я могу (казалось бы) переназначить значение, используя аналогичный синтаксис (заключая переменную и новое значение в скобки).

Редактировать: люди показывают, что они не могут воспроизвести проблему при запуске кода, как показано в их браузере. Я изначально не играл с этим в REPL узла, но при этом получается поведение, которое можно ожидать (пытаясь переназначитьconst var выдает ошибку, переменные let подходят для переназначения). На данный момент мне просто любопытно, почему это поведение отличается от моего браузера. Я использую версию 64.0.2.

Чтобы попытаться выяснить это, я просмотрел следующее:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

https://javascript.info/destructuring-assignment

Казалось, что ни один из них не затронул вопрос оприсваивание значений переменным (или объектам), созданным с использованием деструктуризации.Способ, которым я подхожу к этому технически правильно?Я также начинаю знакомиться с сборкой мусора и т. Д. (К которой у меня есть только краткое введение), и поэтому мне интересно, если я использую «технику» переназначения, создающую кучу вещей, которые не собирают мусорили создает странные указатели и т. д., которые могут вызвать проблемы в будущем.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Кажется, это было что-то странное в FireFox.Я только что обновил до 65.0, и это поведение больше не происходит.

0 голосов
/ 31 января 2019

ошибка не выдается (что я обычно ожидаю при попытке переназначить переменную const.

Я не могу воспроизвести. Я вижу ошибку при запуске этого кода:«Uncaught TypeError: Присвоение постоянной переменной.»

const [firstThing, secondThing] = ["first value", "second value"] 
console.log(firstThing) // expected output: first value
firstThing = "some new thing" 
console.log(firstThing) // expected output: first value

И если я использую let, это позволяет мне переназначить.

let [firstThing, secondThing] = ["first value", "second value"] 
console.log(firstThing) // expected output: first value
firstThing = "some new thing" 
console.log(firstThing) // expected output: first value

Также невозможно воспроизвести в консоли Firefox:

enter image description here

Диагноз немного сложнокакая разница в вашей среде по сравнению с нашей.Может быть, другая версия браузера, может быть плагин, кто знает.В любом случае, код, который вы выложили, просто подставив в let вместо const правильный путь переназначения переменных.

...