Как установить объект, переданный по ссылке на ноль? - PullRequest
0 голосов
/ 01 октября 2019

Это мой демонстрационный код:

ngOnInit{
 let p1 : Person = {};
 console.log(p1); //Object { }
 this.setNull<Person>(p1);
 console.log(p1); //Object { }
}

private setNull<T>(obj : T){
 obj = null;
}

Моя цель - установить значение p1 в ноль после вызова setNull().

Я надеюсь хорошо изложить мою проблему. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 01 октября 2019

Моя цель - установить p1 равным нулю после вызова setNull ().

Вы не можете, потому что не", переданный по ссылке. "Это ссылка на объект, переданная значением . «Передача по ссылке» - это термин искусства, означающий, что в функцию передается ссылка на переменную . Ни в TypeScript, ни в JavaScript вообще нет передачи по ссылке.

В этом конкретном случае имеет смысл просто присвоить null p1. Но если у вас был более общий случай, возможно, если setNull не всегда устанавливает его null или делает что-то еще (классический случай «закрывает» p1 в некотором роде),вы можете использовать возвращаемое значение setNull для установки p1, например:

p1 = someFunction(p1);

... где someFunction возвращает значение, используемое для обновления p1 (возможно, null).

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

Но еслиВы безоговорочно присваиваете null без функции, имеющей какую-либо другую причину, просто ... сделайте это, присвойте null p1 без функции.

1 голос
/ 01 октября 2019

Отображается только правильно. И да в JS, Объект передается по реф. p1 содержит ref, который указан {} в памяти.

Теперь вы передали эту ссылку методу, а теперь obj указывает на {}. На этом этапе оба указатели. Вы только что сделали obj = null, что означает, что теперь obj указывает на ноль. Тем не менее, p1 по-прежнему указывает на {}.

Чтобы доказать, что это проход по ref,

сделайте ниже демо:

var p1 = { "name" : "demo" }
function passByRef (obj) {
   obj.name = "demo updated";
}
//call fun with p1
passByRef(p1);
// print p1.name -> it will be updated one
console.log(p.name);

Таким образом, JS похож на Java. Аргумент функции вызывается по ссылке.

0 голосов
/ 01 октября 2019

Вы можете объявить Интерфейс и сделать этот элемент p1 нулевым или не таким:

export Interface IPerson {
bla bla bla
p1? : number;(array, string or whatever)

}

таким образом (при завершении свойства ?) свойство принимается как нулевое как полное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...