#javascript #arrays
Вопрос:
b не определен, и при присвоении » a «в качестве значений по умолчанию он получает его, но при присвоении значения» c » он выдает ошибку, может ли кто-нибудь лучше объяснить, что здесь происходит, или это ошибка?
const [a, b = c, c] = [1, , 3]
Комментарии:
1. Вы не можете использовать
c
его до инициализации.
Ответ №1:
При деструктурировании на переменные выполняется оценка слева направо в порядке массива (или списка свойств).
Переменные, объявленные с const
помощью, не могут быть доступны до запуска строки, которая их инициализирует.
Ваш код эквивалентен:
const arr = [1, , 3];
const a = arr[0];
const b = arr[1] === undefined ? arr[1] : c;
const c = arr[2];
Что должно сделать проблему довольно очевидной; вы пытаетесь извлечь c
ее до того, как переводчик дойдет до этого момента. Это не ошибка.
Для вывода, который вы ищете, c
сначала извлеките, чтобы вы могли использовать его в качестве значения по умолчанию b
.
const arr = [1, , 3];
const c = arr[2];
const [a, b = c] = arr;
console.log(a, b, c);
Но я бы также рекомендовал избегать разреженных массивов, когда это возможно, они могут быть довольно неинтуитивными.
Ответ №2:
Это можно сделать в одной строке. Вы можете уничтожить ключи массива. Получите 2-й индекс перед 1-м и установите его в качестве значения по умолчанию. Это чисто академический подход и не используйте его в реальной базе кода.
const { 0: a, 2: c, 1: b = c } = [1, , 3]
console.log(a, b, c)
Ответ №3:
const [a, b = c, c] = [1, , 3]
Приведенное выше утверждение можно рассматривать как
const a = [1, , 3][0];
const b = [1, , 3][1] || c; // Reference Error
const c = [1, , 3][2];
console.log(a, b, c);
Принимая во внимание, что заявление ниже
const [a, b = c, c] = [1, , 3]
Можно было бы рассматривать как
const a = [1, , 3][0];
const b = [1, , 3][1] || a;
const c = [1, , 3][2];
console.log(a, b, c); //1 1 3
Таким образом, в первом случае c
на него ссылаются до того, как он инициализируется, что приводит к ошибке, но во втором случае a
он уже присутствует, когда на него ссылаются.
Теперь, если вы попробуете использовать то же самое var
, то в первом случае вы не получите ошибку из-за подъема.
var [a, b = c, c] = [1, , 3]
console.log(a, b, c) //1 undefined 3
Комментарии:
1. использование var позволяет переопределить b = c, чего мы не могли бы сделать с помощью let или const…это интересно. Спасибо