JavaScript - Как / Могу ли я установить нулевую ссылку на объект из функции? - PullRequest
8 голосов
/ 09 февраля 2012

Мне интересно, возможно ли это вообще?По сути, у меня есть пара объектов, которые я передаю функции, и при определенных условиях я хочу, чтобы эта функция установила для объекта значение null.только установите аргумент функции в нуль.После вызова функции 'o' все равно будет ссылаться на объект.

Итак, возможно ли это сделать?И если да, то как?

Ответы [ 5 ]

10 голосов
/ 09 февраля 2012

Если вы хотите изменить значение o при вызове f(o), у вас есть две опции:

1) Вы можете f(o) вернуть новое значение для o и присвоить егоo вот так:

var o = {'val' : 0};
o = f(o);
// o == null

Внутри f() вы возвращаете новое значение для o.

function f(v) {
    if (whatever) {
        return(null);
    }
}

2) Вы помещаете o в другой объект и передаете ссылкуна этот контейнерный объект в f().

function f(v) {
    if (whatever) {
        v.o = null;
    }
}

var c = {};
c.o = {'val' : 0};

f(c);
// c.o == null;

Язык javascript не имеет истинных указателей, как в C / C ++, которые позволяют передавать указатель на переменную и затем возвращаться через этот указатель, чтобы изменитьзначение этой переменной изнутри функции.Вместо этого вы должны сделать это одним из этих двух других способов.Объекты и массивы передаются по ссылке, чтобы вы могли вернуться к исходному объекту из функции.

2 голосов
/ 09 февраля 2012

JavaScript всегда передает аргументы функции «по значению».Это означает, что функция не может изменить то, на что указывает переменная вне функции.

Однако, когда вы передаете объект функции, переданное «значение» является ссылкой на фактический объект, а некопия объекта.Поэтому, хотя вы не можете установить для внешней переменной значение null или другой объект, вы можете изменить содержимое этого объекта.Это означает, что вы можете сделать что-то вроде этого:

var containerObj = {'o' : {'val' : 0} };

f = function(v) {
  v.o = null;
};

f(containerObj.o);   // This property would be set to null successfully.

Очевидно, что создание группы объектов-контейнеров просто для того, чтобы вы могли передавать их функциям, не очень красиво, но это один из способов сделать это.

Но я бы порекомендовал согласиться с предложением Джеймса Монтаня о том, чтобы функция возвращала объект или значение null и присваивала результат обратно вашей переменной.

2 голосов
/ 09 февраля 2012

Не уверен, что именно это используется, но если вы немного изменили структуру, вы можете сделать это:

var o = {'val' : 0};

var f = function(v)
{
   if(something){
      return null;
   }else{
      return v;
   }
};

o = f(o);
1 голос
/ 03 декабря 2014

Я пришел сюда с той же проблемой.Хотя ответ обертки работает, он уродлив, и моя функция асинхронна, поэтому я не могу вернуть нулевое значение.

Причина, по которой я хотел, чтобы o была null, заключается в том, что позже я использую if (o) //do something, возможно, поэтому OP и другие хотят установить его как null.Таким образом, мое решение, хотя и не было ответа на точный вопрос, было

var o = {'val' : 0};
f = function(v) {
  v.isNull = true;
}
if (!o.isNull) // do something
0 голосов
/ 07 июня 2016

Самый простой способ сделать это - создать глобальную переменную с именем NULL и установить для нее значение null

var NULL = null

Затем вы можете установить существующую переменную в NULL без изменения исходного объекта.

var NULL = null;
var original = {};
var ptr = original;
ptr = NULL;
console.log("original is not null = " + (original!==null));
console.log("ptr is null = " + (ptr===null));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...