как определить, был ли массив создан из итератора (или разброса массива)

#javascript #spread-syntax

Вопрос:

Допустим, у нас есть:

 const foo = [1,2,3];
const bar = [1,...foo,3];
 

Есть ли способ узнать из бара, что он был создан из элементов, содержащихся в foo?

Я думал использовать прокси, но бар инициализирован оператором распространения, поэтому мы не можем сначала проксировать бар…

Комментарии:

1. Зачем тебе это нужно знать ?

2. Вопрос не в том, почему, а в том, как.

3. Ценности есть ценности, язык не хранит «записи» того, что было передано из одного места в другое.

4. @8ХоЛоН Мы пытаемся оспорить ваше предположение. Вам не нужно знать, если вы пытаетесь, вы, вероятно, делаете что-то не так. И учитывая, что это невозможно, мы могли бы предложить жизнеспособный альтернативный подход, если бы знали, чего вы пытаетесь достичь.

5. @8ХоЛоН, так что перехвати использование foo и напиши const bar = reactive(() => [1,...foo,3]); . При создании реактивных систем вам нужно либо быть явным, либо использовать помощь компилятора. Обратите внимание, что у вас та же проблема с const foo = 1; const bar = foo 1; или const foo = []; const bar = foo === baz; — в значении нет ничего bar , что указывало бы на использование foo .

Ответ №1:

Нет, это невозможно сделать. bar является обычным массивом, нет разницы между массивом, созданным с помощью литерала массива с синтаксисом распространения, с помощью concat вызовов или из push цикла ing.

Комментарии:

1. путем ручного нажатия мы можем узнать с помощью прокси (проксировать массив), кстати

2. @8HoLoN Только в том случае, если вы создадите прокси-сервер перед циклом вместо обычного массива. Дело в том, что вы не можете определить это задним числом. Если бы вы могли управлять кодом, создающим массив, вы, конечно, уже знали бы, как он был создан и из чего.

3. абсолютно, поэтому мне было интересно, можно ли использовать аналогичный подход не для обнаружения толчка, а для оператора распространения.