JavaScript распространяет синтаксис против jQuery $ .extend - ByRef и ByVal - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь обновить объект, который глубоко вложен и поэтому имеет довольно длинное имя, которое я не хочу продолжать вводить в моем коде. В этом обсуждении я назову его более коротким названием «цель».

Я начинаю со ссылкой на него более коротким именем 'c':

c = target

Затем я хочу обновить его содержимое, используя другой объект; назовите это update.

Если я использую c = $.extend(c,update), ссылка на c остается «неповрежденной»; то есть c === target верно.

Однако, если я использую c = {...c, ...update}, создается новая переменная; то есть c === target ложно. Моя исходная переменная target не обновляется.

Я не понимаю, почему. Кто-нибудь может объяснить?

Есть корзина на $ extends против JavaScript-распространения

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

В документах jQuery достаточно ясно, как работает extend():

целевой объект (первый аргумент) будет изменен и также будет возвращен из $ .extend ()

Использование оператора спреда отличается. Когда вы пишете это:

c = {...c, ...update}

вы создаете новый объект. Затем вы назначаете c, чтобы указать на этот новый объект. Объект, на который ранее указывал c, не имеет ничего общего с этим. Это просто (от: tc29 / предложение ):

копирует собственные перечисляемые свойства из предоставленного объекта во вновь созданный объект

Чтобы получить желаемое поведение, вы можете использовать Object.assign();

let target = {
  name: "Mark",
  place: "AK"
}

let c = target;

Object.assign(c, {
  name: "Tim"
})
console.log(target)
0 голосов
/ 03 мая 2018

Описание $.extend() гласит:

Объединить содержимое двух или более объектов вместе в первый объект.

То есть объединить два объекта и изменить первый объект со свойствами секунд (или третьего, четвертого и т. Д.)

JavaScript является передачей по ссылке , поэтому при обновлении c (не при установке его на новое значение) вы изменяете тот же объект, на который target является ссылкой.

c = {...c, ...update};

устанавливает c на комбинацию c и update, тогда как

$.extend(c,update);

изменяет объект, на который ссылается c, добавляя свойства update.

Надеюсь, это проясняет

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