#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. абсолютно, поэтому мне было интересно, можно ли использовать аналогичный подход не для обнаружения толчка, а для оператора распространения.