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

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

06.03.2016, 21:49. Показов 2227. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru