Как передать переменные по ссылке в JavaScript? У меня есть 3 переменные, с которыми я хочу выполнить несколько операций, поэтому я хочу поместить их в цикл for и выполнять операции с каждой из них.
псевдокод:
myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
//do stuff to the array
makePretty(myArray[x]);
}
//now do stuff to the updated vars
Каков наилучший способ сделать это?
javascript
variables
pass-by-reference
BFTrick
источник
источник
makePretty(var1); makePretty(var2); makePretty(var3); ...
arr = [var1, var2, var3]; for (var i = 0, len = arr.length; i < len; i++) { arr[i] = makePretty(arr[i]); }
- вам просто нужно сохранить значение, возвращаемоеmakePretty
обратно в слот в массиве.Ответы:
В JavaScript нет «передачи по ссылке». Вы можете передать объект (то есть, вы можете передать по значению ссылку на объект), а затем заставить функцию изменить содержимое объекта:
Вы можете перебирать свойства массива с числовым индексом и изменять каждую ячейку массива, если хотите.
Важно отметить, что «передача по ссылке» - это очень специфический термин. Это не значит, что можно просто передать ссылку на модифицируемый объект. Вместо этого это означает, что можно передать простую переменную таким образом, чтобы позволить функции изменять это значение в вызывающем контексте. Так:
В языке , как C ++, это можно сделать, потому что язык делает (сортировки из) имеет проход по ссылке.
редактировать - это недавно (март 2015) снова взорвалось на Reddit из-за сообщения в блоге, похожего на мое, упомянутое ниже, хотя в данном случае о Java. При чтении взад-вперед в комментариях Reddit мне пришло в голову, что большая часть путаницы проистекает из неудачного столкновения, связанного со словом «ссылка». Термины «передача по ссылке» и «передача по значению» предшествуют концепции наличия «объектов» для работы в языках программирования. Это действительно не об объектах вообще; речь идет о параметрах функции, и, в частности, о том, как параметры функции «связаны» (или нет) с вызывающей средой. В частности,и это будет выглядеть почти так же, как в JavaScript. Однако можно было бы также изменить ссылку на объект в вызывающей среде, и это ключевая вещь, которую вы не можете сделать в JavaScript. Язык передачи по ссылке будет передавать не саму ссылку, а ссылку на ссылку .
редактировать - вот блог в теме. (Обратите внимание на комментарий к этому посту, который объясняет, что C ++ на самом деле не имеет передачи по ссылке. Это правда. Однако C ++ имеет возможность создавать ссылки на простые переменные, либо явно в точке функции вызов для создания указателя или неявно при вызове функций, чья сигнатура типа аргумента требует этого. Это ключевые вещи, которые JavaScript не поддерживает.)
источник
Массивы и объекты передаются по ссылке или по значению на основе следующих условий:
если вы устанавливаете значение объекта или массива, это Pass by Value.
object1 = {prop: "car"}; array1 = [1,2,3];
если вы изменяете значение свойства объекта или массива, то это Pass by Reference.
object1.prop = "car"; array1[0] = 9;
Код
источник
Обходной путь для передачи переменной, как по ссылке:
РЕДАКТИРОВАТЬ
да, на самом деле вы можете сделать это без глобального доступа
источник
Простой объект
Пользовательский объект
объект
rvar
Объявление переменной
Или:
Тестовый код
Результат теста консоли
источник
Еще один подход к передаче любых (локальных, примитивных) переменных по ссылке заключается в переносе переменной с замыканием «на лету»
eval
. Это также работает с «использовать строгий». (Примечание: имейте в виду, чтоeval
это не подходит для оптимизаторов JS, также пропущенные кавычки вокруг имени переменной могут привести к непредсказуемым результатам)Живой пример https://jsfiddle.net/t3k4403w/
источник
Там на самом деле довольно решение:
источник
Мне лично не нравится функциональность «передача по ссылке», предлагаемая различными языками программирования. Возможно, это потому, что я просто открываю концепции функционального программирования, но я всегда получаю мурашки по коже, когда вижу функции, вызывающие побочные эффекты (например, манипулирование параметрами, передаваемыми по ссылке). Я лично твердо придерживаюсь принципа «единой ответственности».
ИМХО, функция должна возвращать только один результат / значение, используя ключевое слово return. Вместо изменения параметра / аргумента я бы просто вернул измененное значение параметра / аргумента и оставил любые желаемые переназначения до вызывающего кода.
Но иногда (надеюсь, очень редко) необходимо возвращать два или более значений результата из одной и той же функции. В этом случае я бы предпочел включить все эти результирующие значения в одну структуру или объект. Снова, обработка любых переназначений должна быть до вызывающего кода.
Пример:
Предположим, что передаваемые параметры будут поддерживаться с помощью специального ключевого слова, например, «ref» в списке аргументов. Мой код может выглядеть примерно так:
Вместо этого я бы предпочел сделать что-то вроде этого:
Когда мне нужно написать функцию, которая возвращает несколько значений, я также не буду использовать параметры, переданные по ссылке. Поэтому я бы избегал кода, подобного этому:
Вместо этого я бы предпочел вернуть оба новых значения внутри объекта, например так:
Эти примеры кода довольно упрощены, но они примерно демонстрируют, как я лично справлюсь с такими вещами. Это помогает мне держать различные обязанности в правильном месте.
Удачного кодирования. :)
источник
findStuff
просто вернуть полученный массив. Вы тоже должны объявитьfoundArray
переменную, так что я бы сразу присвоить получившийся массив к нему:var foundArray = findStuff(inArray); if (foundArray.length > 0) { /* process foundArray */ }
. Это 1) сделает вызывающий код более читабельным / понятным, и 2) значительно упростит внутреннюю функциональность (и, следовательно, также тестируемость)findStuff
метода, сделав его на самом деле намного более гибким в различных (пере) вариантах использования / сценариях.Я играл с синтаксисом, чтобы делать подобные вещи, но для этого нужны некоторые немного необычные помощники. Он начинается с того, что вообще не использует 'var', а представляет собой простой помощник 'DECLARE', который создает локальную переменную и определяет область ее действия посредством анонимного обратного вызова. Управляя тем, как переменные объявляются, мы можем выбрать их оборачивание в объекты, чтобы они всегда могли быть переданы по ссылке. Это похоже на один из ответов Эдуардо Куомо выше, но решение ниже не требует использования строк в качестве идентификаторов переменных. Вот некоторый минимальный код, чтобы показать концепцию.
источник
на самом деле это действительно легко,
проблема в том, что, передав классические аргументы, вы попадаете в другую зону только для чтения.
Решением является передача аргументов с использованием объектно-ориентированного дизайна JavaScript,
это то же самое, что поместить аргументы в переменную global / scoped, но лучше ...
Вы также можете пообещать вещи, чтобы насладиться известной цепочкой: вот и все, с обещающей структурой
или еще лучше ..
action.setArg(["empty-array"],"some string",0x100,"last argument").call()
источник
this.arg
работает только сaction
экземпляром. Это не работает.Javascript может изменять элементы массива внутри функции (он передается как ссылка на объект / массив).
Вот еще один пример:
источник
JS не является сильным типом, он позволяет решать проблемы различными способами, как показано в этом шаге.
Однако, с точки зрения ремонтопригодности, я бы согласился с Бартом Хофландом. Функция должна получить аргументы, чтобы что-то сделать, и вернуть результат. Делая их легко многоразовыми.
Если вы чувствуете, что переменные должны передаваться по ссылке, вам, возможно, лучше обслужить их встраивание в объекты IMHO.
источник
Если оставить в стороне обсуждение по ссылке, те, кто все еще ищет решение поставленного вопроса, могут использовать:
источник
Я точно знаю, что вы имеете в виду. То же самое в Swift не будет проблемой. Нижняя линия является использование
let
неvar
.Тот факт, что примитивы передаются по значению, но тот факт, что значение
var i
в точке итерации не копируется в анонимную функцию, довольно удивительно, если не сказать больше.источник