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

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

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

Author24 — интернет-сервис помощи студентам
Я полный нубер, не могу понять по прердаче аргументов в ф-цию. Вот взять
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2016, 21:49
Ответы с готовыми решениями:

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

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

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

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

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

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  [ТС] 5
efx,
Цитата Сообщение от efx Посмотреть сообщение
В JavaScript все аргументы передаются по значению, по ссылке в JS ничего не передаётся.
В таком случае почему, в таком случае, примитивы и обьекты ведут себя по разному при передаче в ф-цию?
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
07.03.2016, 13:51 6
Лучший ответ Сообщение было отмечено use strict как решение

Решение

Цитата Сообщение от efx Посмотреть сообщение
В JavaScript все аргументы передаются по значению, по ссылке в JS ничего не передаётся.
Вай!) а зачем тогда DCA? Если б все было так радужно, то утечки памяти можно было бы делать на счет 3 и никакой сборщик ни разу не помог бы)
1
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
07.03.2016, 14:28 7
efx, Здрасте. по значению передаются только примитивные типы. не запутывайте человека
1
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 18:16 8
Цитата Сообщение от 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  [ТС] 9
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 10
Лучший ответ Сообщение было отмечено use strict как решение

Решение

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

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

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

Чтобы в этом лучше разобраться и понять что такое присваивание по ссылке и как оно работает на самом деле, установите самый простой компилятор по си к примеру (pelles c), выполните присваивание по ссылке и вы увидите разницу между присваиванием по ссылке и по значению. Лучше один раз попробовать, увидеть и понять, чем пытаться понять без наглядного примера
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
07.03.2016, 21:31  [ТС] 11
efx, дело в том что передача по значению и по ссылке мне, к примеру в ++, мне ясна (во всяком случае мне так хочеться думать). Так вот здесь совсем другой коленкор выходит. А почитаю ка я Фленегана, вдруг пойму чего. А вам - большое спасибо.
0
9 / 9 / 2
Регистрация: 24.01.2016
Сообщений: 87
07.03.2016, 22:01 12
Цитата Сообщение от use strict Посмотреть сообщение
почитаю ка я Фленегана
В этой книге (на 120-121 стр.) об этом хорошо описывается, у Флэнагана этот момент не расписан.
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 23
08.03.2016, 10:12  [ТС] 13
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 14
угу
1
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
10.03.2016, 03:16 15
Цитата Сообщение от 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 16
Цитата Сообщение от Padimanskas Посмотреть сообщение
все объекты передаются по ссылке это черным по белому написано в стандарте
Подтвердите ваши слова ссылкой на то место в стандарте, где это написано.
0
61 / 39 / 20
Регистрация: 06.12.2015
Сообщений: 155
10.03.2016, 07:40 17
Цитата Сообщение от efx Посмотреть сообщение
Вы параметру присвоили ссылку на объект (массив), то есть передав массив параметр получил копию значения (ссылки) на объект, с этим значением вы и работаете в функции. Параметр имеет свою копию ссылки на объект, никак не связанную с оригинальной ссылкой. Это две разные ссылки, просто ссылаются на один объект в памяти.
Как можно сделать копию(ссылку) на объект и при этом получить другое число? Могу догадываться - никак. Если получится другое число, то будет ссылаться на другую переменную и другое число. Если сделать ссылку на другое место в памяти, то тогда придется копировать весь массив(ну чтоб работало) - это не оптимизация.
0
10.03.2016, 07:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2016, 07:40
Помогаю со студенческими работами здесь

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

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

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

проверьте. Напишите функцию семи аргументов, значением которой служит сумма всех семи аргументов
Напишите функцию семи аргументов, значением которой служит сумма всех семи аргументов. (defun X...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru