Подтвердить что ты не робот

Возвращает ли объект Javascript по ссылке или по умолчанию?

У меня есть объект, определенный вне функции, в глобальной области. Этот объект не передается в функцию в качестве аргумента, но функция модифицирует его и возвращает измененный объект.

Что я хотел знать, если функция возвращает копию объекта или оригинальный глобальный объект?

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

4b9b3361

Ответ 1

Всякий раз, когда вы возвращаете объект, вы возвращаете ссылку на объект. Аналогично, когда вы передаете объект, вы передаете ссылку. Однако передача объекта в качестве аргумента может отличаться от простого изменения объекта в глобальной области видимости, как показывают эти примеры. Это связано с тем, что ссылка на объект сама передается по значению.

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

Пример 1:

var object = {foo:'original'};

function changeObject() {
    object.foo = 'changed';
    return object;
}

console.log(changeObject()); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'changed'}

Пример 2:

var object = {foo:'original'};

function changeArgument(object) {
    object.foo = 'changed';
    return object;
}

console.log(changeArgument(object));  // outputs {foo:'changed'}
console.log(object);  // outputs {foo:'changed'}

С другой стороны, если вы переписываете объект новым объектом, это изменение не будет сохраняться, если вы сделаете это с аргументом, но будет сохраняться, если вы сделаете это для глобального объекта. Это потому, что аргумент передает ссылку на объект по значению. Когда вы замените это значение ссылкой на новый объект, вы больше не говорите об одном и том же объекте.

Пример 3:

var object = {foo:'original'};

function replaceObject() {
    object = {foo:'changed'};
    return object;
}

console.log(replaceObject()); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'changed'}

Пример 4:

var object = {foo:'original'};

function replaceArgument(object) {
    object = {foo:'changed'};
    return object;
}

console.log(replaceArgument(object)); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'original'}

Ответ 2

Может быть, поздний комментарий, но это типичная проблема на любом языке. Объекты, созданные в куче и переданные по ссылке, противоположной примитивам (по значению). Я думаю, что корень вопроса - это общий экземпляр и уникальный, чтобы избежать нежелательных эффектов. Например, мы вызываем функцию, чтобы получить шаблон (объект) для нового пользователя для добавления в коллекцию или хотите удалить форму для отмены события из разных модулей для начала. Это легко понять и легко упускать из виду. Обычно случаи не охватывают все перестановки использования

Контрольный список:

Здесь общий экземпляр:

var bigo = {
    usr: { name: 'steven' },
    bigi: function () {
        return this.usr;
    }
};   
var outA = bigo.bigi();
var outB = bigo.bigi();

print(outA.name); // => steven
print(outB.name); // => steven

outA.name = 'ilan'; // change value

print(outA.name); // => ilan
print(outB.name); // => ilan

Non shared instance:

var bigo = {
    bigi: function () {
        var user = { name: 'steven' };
        return user;
    }
};   

var outA = bigo.bigi();
var outB = bigo.bigi();

print(outA.name); // => steven
print(outB.name); // => steven

outA.name = 'ilan'; // change value

print(outA.name); // => ilan
print(outB.name); // => steven

Ответ 3

Что я хотел знать, если функция возвращает копию объекта или оригинальный глобальный объект?

Эффективно, вы только когда-либо имеете дело со ссылками на объекты в JavaScript. Даже var foo = {} просто назначает ссылку на новый объект на foo.

Ответ 4

Если объект находится вне функции, вам не нужно "возвращать" его. Если вы измените объект внутри функции, он обновит сам объект. Затем вы можете ссылаться на недавно обновленный объект в других функциях по мере необходимости.

Ответ 5

Из вашего вопроса, как я думаю, ваш код выглядит (более или менее):

var o = {};

function f() {
    o.prop = true;
    return o;
}
  • В этом случае глобальная переменная o ссылается на объект.
  • Когда вы изменяете o, вы изменяете любые ссылки o. Следовательно, он изменяет исходный объект.
  • Когда вы возвращаете o, вы возвращаете ссылку на исходный объект.

Передача объекта функции приводит к ссылке на исходный передаваемый объект. Следовательно, любые изменения влияют на исходный объект. Например:

var o = {};

f(o);

console.log(o.prop); // true

function f(o) {
    o.prop = true;
}