Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Использование ссылок для манипуляции данными


Автор: dеluxe 16.8.2010, 00:41
здравствуйте, не совсем понимаю какие отличия, когда происходит копирование переменой и когда переменная получает ссылку, саму суть ссылки и копии переменой знаю, что и как работает в чем отличие, только не совсем понимаю как в js определить что переменная или функция получают ссылку или же только копию переменой. 

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

или как массив totals получил ссылку на массив тоже не понятно smile 
Пример из книги
Код

// Здесь создается объект, который соответствует дате Рождества в 2007 году
// Переменная xmas хранит ссылку на объект, а не сам объект
var xmas = new Date(2007, 11, 25);
// Затем выполняется копирование ссылки, получается вторая ссылка на оригинальный объект
var solstice = xmas; // Обе переменные ссылаются на тот же самый объект
// Здесь выполняется изменение объекта с помощью новой ссылки
solstice.setDate(21);
// Изменения можно наблюдать при использовании первой ссылки
xmas.getDate( ); // Возвращает 21, а не первоначальное значение 25
// То же происходит при передаче объектов и массивов в функции.
// Следующая функция складывает значения всех элементов массива.
// Функции передается ссылка на массив, а не копия массива.
// Благодаря этому функция может изменять содержимое массива, переданного
// по ссылке, и эти изменения будут видны после возврата из функции.
function add_to_totals(totals, x)
{
    totals[0] = totals[0] + x;
    totals[1] = totals[1] + x;
    totals[2] = totals[2] + x;
}


например в C есть операция взятия адреса &, ставишь когда нужно получить ссылку или при передачи в функц. достаточно void fun(&value){} получу еще одну ссылку на данные, только в прототипе указать ссылочный параметр, все к тому что наглядно видно что делаем... даже если сравнить по этому случаю не видно как можно сделать тоже самое, передать простую переименую число например по ссылке в js(

такой же пример только с копиями переменными из книги
Код

// Первой рассматривается операция копирования по значению
var n = 1;   // Переменная n хранит значение 1
var m = n;   // Копирование по значению: переменная m хранит другое значение 1
// Данная функция используется для иллюстрации операции передачи величины по значению
// Как вы увидите, функция работает не совсем так, как хотелось бы
function add_to_total(total, x)
{
    total = total + x; // Эта строка изменяет лишь внутреннюю копию total
}
// Теперь производится обращение к функции, которой передаются по значению числа,
// содержащиеся в переменных n и m. Копия значения из переменной n внутри функции
// доступна под именем total. Функция складывает копии значений переменных m и n,


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

 

Автор: IDVsbruck 16.8.2010, 01:23
Ну, язык js сложно сравнивать с высокоуровневыми языками - все-таки надо учитывать специфику, да и мультиплатформенность js накладывает отпечаток.

Что касается рассмотренного вопроса - его я так и не увидел. Что имеется в виду? Зачем столько воды?
Хотя можно и попытаться сформулировать его для себя ... 
1. В js все есть объект;
2. Применение операторов. "=" - есть не только равенство, но и оператор назначения, в отношении объектов это передача ссылки на объект;
однако "+" работает только со скалярами (если отвлечься от стрингов).
Соответственно "... = ... + ..." есть вычисление над скалярной величиной, получение результата и передача ссылки на объект результата.
Что не понятно ТС - мне не совсем ясно.

Автор: EmilRegis 16.8.2010, 05:44
ТС, http://forum.vingrad.ru/forum/topic-296042.html

Автор: dеluxe 16.8.2010, 06:46
благодарю, немного понятней стало

IDVsbruck, хорошо если не понятно написал... можете тогда сделать следующее...
Напишите мне пожалуйста пример как получить ссылку простой переменой базового типа var y = 10; Или просто передать эту переменную в функцию по ссылке.


EmilRegis, если честно думал это делается проще как то, с использование какого то оператора...  smile  ,  а для массивов тоже есть что-то подобное?  


Автор: dеluxe 16.8.2010, 23:31
нашел хорошую тему по ссылкам, вычитал что-то новое http://javascript.ru/forum/misc/11148-ssylki-ukazateli-v-js.html может кому то тоже пригодится smile 

спасиб вам за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)