Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Присваивание по ссылке и значению (https://javascript.ru/forum/misc/40940-prisvaivanie-po-ssylke-i-znacheniyu.html)

hrundel 25.08.2013 13:18

Присваивание по ссылке и значению
 
Вот здесь я увидел пример:
function func() {
	var funcObj = arguments.callee

	funcObj.test++
	alert(funcObj.test)
}
func.test = 1
func()
func()

Ниже было примечание, что
Код:

В примере нельзя было сделать присвоение:

var test = arguments.callee.test
test++
так как при этом операция ++ сработала бы на локальной переменной test, а не на свойстве test объекта функции.

Почему так происходит? У меня есть предположение, что в JavaScript есть некий механизм передачи переменных по ссылке и по значению.

Возникли следующие вопросы:

1) Есть ли в JavaScript что-то похожее на передачу по ссылке?

2) Как можно понять, что записав var myvar=some.var, будет ли в var ссылка на объект или же создаётся новая локальная переменная? Если я сделаю myvar++, то я сделаю эту операцию на локальной переменной или же на объекте, на который ссылается эта переменная.

Dmitriyff 25.08.2013 13:53

строка и число всегда передаются по значению

все остальное по ссылке

var a = 1, 
     b = a;  // присваивается значение

b = 2; 
console.log(a, b); // 1, 2

var a = {},
     b = a;  // присваивается ссылка на объект

a.a = 1;
b.a = 2;

console.log(a.a, b.a) // 2, 2


a.a и b.a, это одна и таже переменная, потому как a и b ссылаются на один и тот же объект

Dmitriyff 25.08.2013 13:55

Цитата:

Сообщение от hrundel
2) Как можно понять, что записав var myvar=some.var, будет ли в var ссылка на объект или же создаётся новая локальная переменная? Если я сделаю myvar++, то я сделаю эту операцию на локальной переменной или же на объекте, на который ссылается эта переменная.

вы сделаете операцию на локальной переменной, переменная some.var не изменится

hrundel 25.08.2013 14:26

Здесь я увидел, что автор говорит следующее:
Цитата:

При этом, так как функция — это объект, то и копируется она «по ссылке».
А про это какая-нибудь статья полезная есть? Или может в ECMA про это пишут? Вопрос ведь интересный, сам часто спотыкался и не мог понять, почему код не работает.
Dmitriyff, спасибо, хороший пример.

hrundel 25.08.2013 14:29

Цитата:

Сообщение от Dmitriyff (Сообщение 269218)
вы сделаете операцию на локальной переменной, переменная some.var не изменится

Значит надо постоянно отслеживать, что содержится в переменной? Если это функция, то держать в уме, что работа с неё будет по ссылке, если что-то другое, то по значению. По другому значит никак нельзя?

Dmitriyff 25.08.2013 15:40

думаю эта статья даст полный ответ и понимание что да как

ksa 25.08.2013 17:06

Цитата:

Сообщение от hrundel
Значит надо постоянно отслеживать, что содержится в переменной?

Зачем следить? Просто нужно понимать, что значения это только строка или число... Остальное просто ссылка...

Цитата:

Сообщение от hrundel
По другому значит никак нельзя?

Никак.


Часовой пояс GMT +3, время: 00:40.