Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.11.2014, 17:48
Новичок на форуме
Отправить личное сообщение для Zoltan Посмотреть профиль Найти все сообщения от Zoltan
 
Регистрация: 27.11.2014
Сообщений: 3

Передача аргументов по ссылке
Доброго времени суток! Помогите, пожалуйста, разобраться вот с такой ситуацией. Учитывая тот факт, что объекты передаются в 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 внутри функции? Заранее благодарствую за ответы
Ответить с цитированием
  #2 (permalink)  
Старый 27.11.2014, 17:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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

Последний раз редактировалось рони, 27.11.2014 в 18:03.
Ответить с цитированием
  #3 (permalink)  
Старый 27.11.2014, 18:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zoltan,
Цитата:
1.Результат typeof null == "object" — это официально признанная ошибка в языке, которая сохраняется для совместимости.
На самом деле null — это не объект, а примитив. Это сразу видно, если попытаться присвоить ему свойство:
.
http://learn.javascript.ru/type-detection
Ответить с цитированием
  #4 (permalink)  
Старый 27.11.2014, 18:17
Новичок на форуме
Отправить личное сообщение для Zoltan Посмотреть профиль Найти все сообщения от Zoltan
 
Регистрация: 27.11.2014
Сообщений: 3

Сообщение от рони Посмотреть сообщение
Zoltan,
вы аргументу новую ссылку поставили почему он должен указывать на прежний обьект примитив ?
Я правильно понял, что несмотря на то, что объекты передаются по ссылке, сами ссылки передаются по значению и поэтому работают только внутри функции?
Ответить с цитированием
  #5 (permalink)  
Старый 27.11.2014, 19:17
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Во-первых, ты передал не объект, а null. Ну а во вторых, если бы даже передал объект, то
Сообщение от Zoltan
function f(n)
Вот тут n ссылается на тот же объект, что и N.
Сообщение от Zoltan
n = new Object();
Теперь n ссылается на новый объект. А N ссылается на старый. Если ты и в N присвоишь что-нибудь другое, то на старый объект никто ссылаться не будет. Но он будет сидеть в памяти еще некоторое время. Пока сборщик не удалит.

Присваивая новое значение в переменную, ты его не записываешь в связанную с переменной память, ты создаешь новую область памяти и записываешь значение туда. А старая область остается нетронутой.
Речь конечно об объектах.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 29.11.2014, 14:25
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Zoltan
Учитывая тот факт
Это не факт, это бред

null = new Object();
Ответить с цитированием
  #7 (permalink)  
Старый 29.11.2014, 14:29
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от 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>
Ответить с цитированием
  #8 (permalink)  
Старый 29.11.2014, 14:40
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

function f(n){
var n =
}
Ответить с цитированием
  #9 (permalink)  
Старый 29.11.2014, 20:59
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Zoltan
Почему не происходит переназначение переменной N внутри функции?
Потому что внутри функции ты создаешь новую, локальную ссылку на совершенно другой объект.
Ответить с цитированием
  #10 (permalink)  
Старый 29.11.2014, 21:04
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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

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

Последний раз редактировалось krutoy, 29.11.2014 в 21:06.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача в функцию переменного количества аргументов Эдди Элементы интерфейса 35 09.11.2018 15:25
Передача значений по ссылке в функцию jQuery AlexDf jQuery 11 26.03.2015 20:58
Передача аргументов по ссылке (PHP) Tim Оффтопик 6 04.02.2013 10:42
Передача по ссылке методом POST zsaz Общие вопросы Javascript 15 16.04.2011 10:39
передача параметров по ссылке KOLANICH Общие вопросы Javascript 2 14.06.2010 15:25