Деструктурирующий Массив

#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…это интересно. Спасибо