JavaScript Передача переменных через ссылку

Есть ли в JavaScript эквивалент для передачи ссылок PHP по переменным?

[PHP]:

function addToEnd(&$theRefVar,$str)
{
    $theRefVar.=$str;
}
$myVar="Hello";
addToEnd($myVar," World!");
print $myVar;//Outputs: Hello World!

Как будет выглядеть тот же код в JavaScript, если это возможно?

Спасибо!

 HoLyVieR07 окт. 2010 г., 05:10

Ответы на вопрос(4)

как в PHP. Существует возможный обходной путь, чтобы сделать что-то подобное.

function addToEnd(obj, str)
{
    obj.value += str;
}

myVar={value:"Hello"};

addToEnd(myVar, " World");   
alert(myVar.value); //Outputs: Hello World!

В этом примере происходит то, что вы передаете объект функции, а внутри нее вы изменяетеобъект (непеременнаяпеременная все еще указывает на тот же объект). Вот почему эта переменная, не передаваемая по ссылке, неправильно указала vol7ron.

 HoLyVieR07 окт. 2010 г., 02:12
@Null Я добавил немного точности.
 NullUserException07 окт. 2010 г., 02:10
@ Привет, у меня просто проблема с тем, как ты это сформулировал.
 vol7ron07 окт. 2010 г., 16:44
@HoLyVieR: каждому свое :)
 Matthew Flaschen07 окт. 2010 г., 02:09
Это в основном правильно. Функция мутирует полеobj, но не выполняет никаких заданий. Если это назначеноobjЭто не будет иметь никакого полезного эффекта.
 NullUserException07 окт. 2010 г., 02:07
«Вы модифицируете объект (не переменную)» И объект не является переменной?
 HoLyVieR07 окт. 2010 г., 04:07
@ vol7tron То, как вы сформулировали свой ответ, в лучшем случае вводит в заблуждение, а в худшем - просто неверно. Я добавил этот ответ, чтобы он дал правильное объяснение.
 vol7ron07 окт. 2010 г., 03:31
Я не согласен с этим. Я нахожу забавным, что код, который вы предоставили, по сути такой же, но я никогда не соглашался ни с одним из сделанных комментариев. Я не вижу необходимости повторять сказанное в комментарии. Я полагаю, они согласны с ответом.
 HoLyVieR07 окт. 2010 г., 02:09
@Null Переменная все еще указывает на тот же объект. Это не изменилось.
Решение Вопроса

Объекты пройденыкак Рекомендации.

   function addToEnd(obj,$str)
   {
      obj.setting += $str;
   }

   var foo = {setting:"Hello"};
   addToEnd(foo , " World!");

   console.log(foo.setting);                    // Outputs: Hello World!

Редактировать:

Как указано в комментариях ниже,CMS упомянул о великомстатья.Следует отметить, что нет верного способа что-либо передатьпо ссылке в JavaScript. Первая строка была изменена с «по ссылке» на «как ссылка». Этот обходной путь настолько близок, насколько это возможно (даже глобалы иногда выглядят смешно).КакCMS, HoLyVieR, а такжеМэтью указать, различие должно быть сделано, чтоfoo является ссылкой на объект, и эта ссылка передаетсязначение к функции.

Следующее включено в качестве еще одного способа работы со свойством объекта, чтобы сделать ваше определение функции более надежным.

   function addToEnd(obj,prop,$str)
   {
      obj[prop] += $str;
   }

   var foo = {setting:"Hello"};
   addToEnd(foo , 'setting' , " World!");

   console.log(foo.setting);                    // Outputs: Hello World!
 Matthew Flaschen07 окт. 2010 г., 01:45
Нет, они не. Если бы они были, это бы уже работало. Вы передаете значение ссылки, которая отличается. Это также называетсявызов по обмену.
 vol7ron07 окт. 2010 г., 02:04
@HoLyVieR: Я думаю, что это будет ожидаемое поведение истинной ссылки, но это не то, что на самом деле произойдет.
 Matthew Flaschen07 окт. 2010 г., 02:08
@ Null, я думаю, @HoLy говорит, что C # имеетвариант того, что,ref а такжеout параметры.
 Matthew Flaschen07 окт. 2010 г., 01:51
"ссылки передаются по значению" является правильным. "передано по ссылке" нет. Неважно, думаете ли вы, что это «близко». Это не передать по ссылке.
 NullUserException07 окт. 2010 г., 01:52
@ Matthew До сих пор я слышал, как люди говорят, что в Java (не JS) объекты передаются по ссылке, а примитивы передаются по значению.
 NullUserException07 окт. 2010 г., 01:57
@ Матвей, я знаю, что они технически не правы.
 vol7ron07 окт. 2010 г., 01:51
@CMS: это отличная статья, которую должны прочитать многие :)
 vol7ron07 окт. 2010 г., 01:52
@Matthew Flaschen: вы собираетесь спорить, что он имел в виду "в JavaScript "тоже?
 Matthew Flaschen07 окт. 2010 г., 01:54
@ Null, и по сей день они не правы. Если они были правы,void foo(String s){s = "foo";} void bar(){String myS = "bar"; foo(myS); System.out.println(myS)} будет печатать "Foo", когда вы позвонилиbar.
 vol7ron07 окт. 2010 г., 03:18
... все же главное: не существует эквивалента, но если бы кто-то хотел имитировать что-то вроде передачи по ref, вы бы поместили переменную в объект; который, учитывая заданный вопрос и баллы пользователя, я сделал вывод, что это именно то, что на самом деле ищут.
 HoLyVieR07 окт. 2010 г., 01:58
Объект, переданный по ссылке, это совсем другое дело, в C # он есть, и вы можете сделать «obj = new Object ();» (внутри функции) и это изменило бы значение obj (вне функции тоже). В Javascript это просто не будет работать.
 vol7ron07 окт. 2010 г., 16:41
Я снова согласен. Запутанные ответы или ответы, в которых используется свободное определение термина по сравнению с правильной терминологией, такой как та, которую я перечислил, должны быть разъяснены. Я полагаю, что CMS, Мэтью и Холивир преуспели в проведении этого различия. Ответ обновлен.
 CMS07 окт. 2010 г., 01:48
Ну, это не совсем так,примитивные ценности «передаются по значению», с объектами, я бы сказал,Рекомендации передаются по значению также. Отличная статья:ECMA-262-3 подробно. Глава 8. Оценка стратегии
 Shog907 окт. 2010 г., 05:04
@ vol7ron: Я в порядке со всем этим - но чтобы избежать путаницы (потому что этоявляется что-то, от чего JS-новички зацикливаются) Мне бы понравилось, если бы вы изменили первое предложение в своем ответе (на что-то вроде «Объекты переданы»как ссылки "). FWIW: обычно считается хорошей практикой редактировать ключевые части комментариев в ответах, так как комментарии, как правило, пропускаются (и иногда удаляются).
 HoLyVieR07 окт. 2010 г., 02:08
 vol7ron07 окт. 2010 г., 03:18
@ Shog9: я полностью согласен. Кроме того, эти комментарии должны быть включены в ответ. Тем не менее, когда дело доходит до терминов и неофитов, иногда вам приходится делать вывод о том, что спрашивают, а не принимать это за буквальное определение. В противном случае, как я уже говорил выше, вы будете спорить об определении «in», которое может быть внутренним созданием интерпретатора JavaScript или, возможно, буквальными пространственными атрибутами 3D самого JavaScript. Мне не сложно, просто говорю, что вы можете взять то, что вы хотите от вопроса ...
 Shog907 окт. 2010 г., 03:05
@ vol7ron: Я знаю, что это звучит так, будто люди здесь просто педантичны, но разница настолько же критична, насколько и тонка: хотя вы можете настроить свой код для использования ссылок на объекты в некоторых ситуациях, есть общие шаблоны, которые просто невозможны без Истинный переход по ссылке - так что различие важно.
 vol7ron07 окт. 2010 г., 01:47
Мэтью Флашен, да, они есть. Смотри выше. Это так близко к ссылке, как вы собираетесь получить.

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

var someText = "asd";
addToEnd(someText, "fgh", function(val) { someText = val; });

а также

function addToEnd(original, str, setValue)
{
    setValue(original += str);
}

но лучшее решение будет

var someText = "asd";
someText = addToEnd(someText, "fgh");

а также

function addToEnd(original, str)
{
    return original += str;
}
 Luke Schafer08 окт. 2010 г., 02:10
@ vol7ron спасибо, копия вставляет снова! :)
 vol7ron08 окт. 2010 г., 06:53
мы все были там :) Это был один из случаев, когда поначалу меня это смущало, главным образом потому, что оно присутствовало в первом примере. Намного лучше теперь, когда вы отредактировали это.
 vol7ron07 окт. 2010 г., 16:49
тебе не нужноsetValue аргумент в последнем определении функции.

попробуй это:

// function
function func(param,callback){
    if(param){
     if(typeof callback=='function') {
         callback.call(this,param);
     }
     return true;
    }
    return false;
}
// calling function
var variable=0;
returnValue=func(10,function(reference){variable=reference});
alert(returnValue+'/'+variable);

Ваш ответ на вопрос