Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23

О передаче аргументов в функцию

06.03.2016, 21:49. Показов 2311. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я полный нубер, не могу понять по прердаче аргументов в ф-цию. Вот взять
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"use strict";
 
var menu = {
  width: 200,
  height: 300,
  title: "My menu"
};
 
function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n)
}
function multiplyNumeric(obj){
    for(var key in obj){
        if(isNumeric(obj[key])){
            obj[key]*=2;
        }
    }
};
multiplyNumeric(menu);
console.log(menu);
Здесь обьект передаеться по ссылке, то есть по адресу, решил так потому что обьект меняеться(по аналогии с ++),
то есть по значению передаються только примитивные типы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2016, 21:49
Ответы с готовыми решениями:

Передача аргументов в функцию, вызываемую setTimeout
Вот у меня код: func=function(word) { alert(word) setTimeout(func,1000) } func("hi") Но setTimeout не передаёт...

Описать и протестировать функцию с переменным количеством аргументов произвольного типа, возвращающую максимум
Помогите решить задачу на языке JavaScript. 1)Описать и протестировать функцию с переменным количеством аргументов произвольного типа,...

Функцию не работает при передаче разных значений.
На странице есть input n-ое кол-во штук, при нажатии происходит вызов функции changeSelect echo "<tr><td><input...

16
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
06.03.2016, 21:55
Да. Примитивы типа целого или строки передаются как значение (или точнее как копия).
А объекты уже по ссылке.
1
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 09:51
Цитата Сообщение от Hikari Посмотреть сообщение
Примитивы типа целого или строки передаются как значение (или точнее как копия).
А объекты уже по ссылке.
В JavaScript все аргументы передаются по значению, по ссылке в JS ничего не передаётся.
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
07.03.2016, 10:19
с объектами напрямую яваскрипт вообще не работает

var myVar = new Object; // переменная myVar - это не сам объект, а лишь ссылка на него

аналогично и с объектами DOM
var myVar2 = document.getElementById ('elem_id'); // и myVar2, и document.getElementById ('elem_id') -- это ссылки на объект,
// а сам объект (HTML-тег с id="elem_id") виртуален и находится в DOM
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
07.03.2016, 10:55  [ТС]
efx,
Цитата Сообщение от efx Посмотреть сообщение
В JavaScript все аргументы передаются по значению, по ссылке в JS ничего не передаётся.
В таком случае почему, в таком случае, примитивы и обьекты ведут себя по разному при передаче в ф-цию?
0
Superposition
 Аватар для Padimanskas
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
07.03.2016, 13:51
Лучший ответ Сообщение было отмечено use strict как решение

Решение

Цитата Сообщение от efx Посмотреть сообщение
В JavaScript все аргументы передаются по значению, по ссылке в JS ничего не передаётся.
Вай!) а зачем тогда DCA? Если б все было так радужно, то утечки памяти можно было бы делать на счет 3 и никакой сборщик ни разу не помог бы)
1
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
07.03.2016, 14:28
efx, Здрасте. по значению передаются только примитивные типы. не запутывайте человека
1
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 18:16
Цитата Сообщение от temkasky Посмотреть сообщение
Здрасте. по значению передаются только примитивные типы. не запутывайте человека
Ну зачем же вы врёте? Вроде изучаете с++ и пишите такие глупости про передачу аргументов по ссылке в JS. Вы как раз и вводите в заблуждение человека своими словами.

Вы в си или с++ пробовали по ссылке передавать аргумент? Вы знаете, что именно присваивается идентификатору по ссылке?

Вот вам пример:
JavaScript
1
2
3
4
5
6
7
8
9
function foo(obj) {
  obj.str = "Строка1";  // Значение переменной - ссылка на область памяти в которой находится объект, а не адрес идентификатора
  obj = new Object;     // Присваиваем переменной ссылку на другой объект
  obj.str = "Строка2";  // Значение свойства name предыдущего объекта не изменилось
}
 
var obj = new Object;
foo(obj);
alert(obj.str);    // "Строка1"
Если вы в си или в с++ присвоите по ссылке, то присвоив внутри функции переменной ссылку на новый объект, значение оригинальной переменной также изменится, а так как в JS всё присваивается по значению, то значение оригинальной переменной не меняется на другой объект.

Добавлено через 4 минуты
Цитата Сообщение от use strict Посмотреть сообщение
В таком случае почему, в таком случае, примитивы и обьекты ведут себя по разному при передаче в ф-цию?
Одинаково, вы параметру значение присваиваете, примитивное или ссылку. Если бы происходило присваивание по ссылке, то изменение значения переменной, так же отражалось бы и на значении оригинальной переменной. Однако этого не происходит, как показано в примере выше.

Присвоить саму ссылку именно на объект и "присвоить по ссылке" это немного разные вещи
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
07.03.2016, 20:53  [ТС]
efx, Все равно тяжело вьезжаю. Вот функция
JavaScript
1
2
3
4
5
6
7
function multiplyNumeric(obj){
    for(var key in obj){
        if(isNumeric(obj[key])){
            obj[key]*=2;
        }
    }
};
передал масив, он изменился, значит копия не создавалась, а он пошел по адресу?

Добавлено через 19 минут
efx, ваш пример, чесно говоря, меня вообще из тапок выбил. обьект передается в ф-цию, там он меняеться( добавляем свойство str), затем какая то вуду магия пошла обьясните пожалуста, хотя бы пару строчек
0
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 21:20
Лучший ответ Сообщение было отмечено use strict как решение

Решение

Цитата Сообщение от use strict Посмотреть сообщение
передал масив, он изменился, значит копия не создавалась
Копия массива не создавалась, а вот копия значения (ссылки) создалась.

Вы параметру присвоили ссылку на объект (массив), то есть передав массив параметр получил копию значения (ссылки) на объект, с этим значением вы и работаете в функции. Параметр имеет свою копию ссылки на объект, никак не связанную с оригинальной ссылкой. Это две разные ссылки, просто ссылаются на один объект в памяти.

Если бы в JS было присваивание по ссылке, то ЛЮБОЕ новое присвоенное значение параметру, так же отражалось бы на оригинальной переменной.

Чтобы в этом лучше разобраться и понять что такое присваивание по ссылке и как оно работает на самом деле, установите самый простой компилятор по си к примеру (pelles c), выполните присваивание по ссылке и вы увидите разницу между присваиванием по ссылке и по значению. Лучше один раз попробовать, увидеть и понять, чем пытаться понять без наглядного примера
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
07.03.2016, 21:31  [ТС]
efx, дело в том что передача по значению и по ссылке мне, к примеру в ++, мне ясна (во всяком случае мне так хочеться думать). Так вот здесь совсем другой коленкор выходит. А почитаю ка я Фленегана, вдруг пойму чего. А вам - большое спасибо.
0
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 22:01
Цитата Сообщение от use strict Посмотреть сообщение
почитаю ка я Фленегана
В этой книге (на 120-121 стр.) об этом хорошо описывается, у Флэнагана этот момент не расписан.
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
08.03.2016, 10:12  [ТС]
efx, Спасибо, очень и очень доходчивая книженция. По скольку тип ссылочный, создается илюзия что
обьекты идут по ссылке, на самом деле все передаетьс по значению. В плюсах это так
C++
1
2
3
void foo(int*arr){};
void foo1(int*&arr){};
int arr = new int[10]();
в вашем примере
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function foo(obj) {
  obj.str = "Строка1";  // Значение переменной - ссылка на область памяти в которой находится объект, а не адрес идентификатора
  obj = new Object;     // Присваиваем переменной ссылку на другой объект
  obj.str = "Строка2"; // Значение свойства name предыдущего объекта не изменилось
  return obj;
}
 
var obj = new Object();
var obj1 = foo(obj);
alert(obj.str);
alert(obj1.str);
я правильно понял?
0
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
08.03.2016, 17:19
угу
1
Superposition
 Аватар для Padimanskas
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
10.03.2016, 03:16
Цитата Сообщение от efx Посмотреть сообщение
// Присваиваем переменной ссылку на другой объект
Неа Это создает новую переменную и равносильно инструкции var obj = new Object;
В старом стандарте JavaScript псевдо-массив arguments и переменные-параметры ссылаются друг на друга, в новом нет. Поэтому если установить внутри функции директиву strict, то arguments покажет старое значение, в другом случае мы увидим новое значение. Так или иначе, все объекты передаются по ссылке это черным по белому написано в стандарте Call by reference(pass-by-reference).
В общем-то меня не это интересует, а то откуда этот листинг с комментариями. Из книги??
0
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
10.03.2016, 07:19
Цитата Сообщение от Padimanskas Посмотреть сообщение
все объекты передаются по ссылке это черным по белому написано в стандарте
Подтвердите ваши слова ссылкой на то место в стандарте, где это написано.
0
 Аватар для Goga5
61 / 39 / 20
Регистрация: 06.12.2015
Сообщений: 155
10.03.2016, 07:40
Цитата Сообщение от efx Посмотреть сообщение
Вы параметру присвоили ссылку на объект (массив), то есть передав массив параметр получил копию значения (ссылки) на объект, с этим значением вы и работаете в функции. Параметр имеет свою копию ссылки на объект, никак не связанную с оригинальной ссылкой. Это две разные ссылки, просто ссылаются на один объект в памяти.
Как можно сделать копию(ссылку) на объект и при этом получить другое число? Могу догадываться - никак. Если получится другое число, то будет ссылаться на другую переменную и другое число. Если сделать ссылку на другое место в памяти, то тогда придется копировать весь массив(ну чтоб работало) - это не оптимизация.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2016, 07:40
Помогаю со студенческими работами здесь

передача аргументов в функцию
Всем привет не понимаю что за конченный язык этот javascript и на ем же основанная jquery. есть обычный код который будет работать во...

Ошибка при передаче аргументов в функцию
Есть функция определения минимального значения: float minimum(float x,float y) { x = (x<y)? x : y; return x; } Когда...

итерация при передаче аргументов в функцию
Доброго времени суток хочу передать в функцию аргумент итерируемый при передаче то есть чтобы это выглядело так : ...

VS 2012: Ошибка при передаче аргументов в функцию WriteLine()
Господа, приветствую! разбираю задачки из книги Айвора Хортона (Visual C++ 2010. Полный курс) Есть код в Visual C++ 2012: ...

проверьте. Напишите функцию семи аргументов, значением которой служит сумма всех семи аргументов
Напишите функцию семи аргументов, значением которой служит сумма всех семи аргументов. (defun X (1 3 4 3 4 3 2) (apply '+ (list 1 3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru