2014-12-19 4 views
2

В этом простом скрипте я пытаюсь изменить значение строки, содержащейся в a.person. Почему он не обновляет значение object.property?Как я могу обновить свой объект динамически?

function searchObject(object, value) { 
 

 
    object = value; 
 

 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a.person, "James"); 
 

 
document.write(a.person);

Я думал, что вывод должен быть "Джеймс", а не "Ян". Почему он не обновляет мой объект?

+2

Вы передаете функцию только как строку, а не объект или что-то в этом роде. Итак, как же так или иначе получить ссылку на родительский объект? – Sirko

ответ

6

То, что вы делаете сейчас заменяет локальную переменную object со значением value. Что вы могли бы сделать, вместо того, чтобы достичь этого:

function searchObject(object, property, value) { 
 
    object[property] = value; 
 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a, 'person', "James"); 
 

 
document.write(a.person);

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

Это связано с тем, что в JavaScript каждый аргумент функции передается по значению, но поскольку объекты хранятся в виде указателей, а не как их значение, это означает, что вам предоставляется только адрес памяти объекта, если вы положили a в ваш параметр функции. Если вы снова получите доступ к этой переменной внутри функции, она будет указателем на ту же самую вещь. Изменение свойств в нем затем изменит свойства в самом объекте.

+1

Ничего себе. Мы оба отправили буквально один и тот же ответ почти одновременно: -D –

+1

Yep: P, вы меня ниндзя на 7 секунд. – Joeytje50

+1

Ответ вы точны, но я бы просто упомянул, что 'object [property] = value' является довольно сжатым синтаксисом для выполнения этой работы. Нет необходимости обертывать его функцией. – rojobuffalo

4

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

function searchObject(object, key, value) { 
 
    object[key] = value; 
 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a, "person", "James"); 
 

 
document.write(a.person);

2

Вы передаете a.person как объект, но a.person - это строковое значение. Строки передаются по значению в JavaScript, а не по ссылке. Это означает, что object в вашей функции по существу является копией строки "Ian", а не фактическим значением a.person

+1

Это, в основном, правда, но не полностью. Все в JS передается по ссылке, но разница в том, что в JS объекты являются * указателями *, а строки и целые числа - нет. Даже если 'a.person' был массивом, выполнение' object = value' в функции все равно не будет работать. – Joeytje50

+0

Очень верно. Я пытался добиться этого с помощью «по существу» копии, но, вероятно, это потребовало дополнительной ясности. – musicfuel

Смежные вопросы