Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача аргументов по ссылке (https://javascript.ru/forum/events/51962-peredacha-argumentov-po-ssylke.html)

Zoltan 27.11.2014 17:48

Передача аргументов по ссылке
 
Доброго времени суток! Помогите, пожалуйста, разобраться вот с такой ситуацией. Учитывая тот факт, что объекты передаются в JS по ссылке, код ниже должен вывести в консоль две одинаковые строки.
<script>
function f(n) {
	n = new Object();
    n['a'] = 10;
    console.log(n);
}
var N = null;
f(N);
console.log(N);
</script>

Вместо этого во втором случае выводится null.
Почему не происходит переназначение переменной N внутри функции? Заранее благодарствую за ответы:)

рони 27.11.2014 17:56

Zoltan,
вы аргументу новую ссылку поставили почему он должен указывать на прежний обьект примитив ?

рони 27.11.2014 18:05

Zoltan,
Цитата:

1.Результат typeof null == "object" — это официально признанная ошибка в языке, которая сохраняется для совместимости.
На самом деле null — это не объект, а примитив. Это сразу видно, если попытаться присвоить ему свойство:
.
http://learn.javascript.ru/type-detection

Zoltan 27.11.2014 18:17

Цитата:

Сообщение от рони (Сообщение 343138)
Zoltan,
вы аргументу новую ссылку поставили почему он должен указывать на прежний обьект примитив ?

Я правильно понял, что несмотря на то, что объекты передаются по ссылке, сами ссылки передаются по значению и поэтому работают только внутри функции?

danik.js 27.11.2014 19:17

Во-первых, ты передал не объект, а null. Ну а во вторых, если бы даже передал объект, то
Цитата:

Сообщение от Zoltan
function f(n)

Вот тут n ссылается на тот же объект, что и N.
Цитата:

Сообщение от Zoltan
n = new Object();

Теперь n ссылается на новый объект. А N ссылается на старый. Если ты и в N присвоишь что-нибудь другое, то на старый объект никто ссылаться не будет. Но он будет сидеть в памяти еще некоторое время. Пока сборщик не удалит.

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

kostyanet 29.11.2014 14:25

Цитата:

Сообщение от Zoltan
Учитывая тот факт

Это не факт, это бред

null = new Object();

kostyanet 29.11.2014 14:29

Цитата:

Сообщение от Zoltan
Почему не происходит переназначение переменной N внутри функции?

Потому что это внешняя переменная о которой функция ничего не знает в той последовательности событий. Вот так думайте:

<script>
function f(var n) {
    n = new Object();
    n['a'] = 10;
    console.log(n);
}

var N = null; // оно и так null
f(N); // абсурд
console.log(N); // оно и так null, так и осталось
</script>

kostyanet 29.11.2014 14:40

Херню написал, дело не в скопе, конечно. Просто создается новая переменная с тем же именем. Все равно что

function f(n){
var n =
}

krutoy 29.11.2014 20:59

Цитата:

Сообщение от Zoltan
Почему не происходит переназначение переменной N внутри функции?

Потому что внутри функции ты создаешь новую, локальную ссылку на совершенно другой объект.

krutoy 29.11.2014 21:04

Цитата:

Сообщение от Zoltan
Почему не происходит переназначение переменной N внутри функции?

"Переназначени" (которое есть деструктивное присваивание):

function f() {
    N = new Object();
    N['a'] = 10;
    alert(N);
}
var N = null;
f();
alert(N);
alert(N.a);


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