2009-03-30 4 views
3

У меня есть следующий простой скрипт.Переменная обновляется «по ссылке»?

<script> 
SPC = { 
    a : [10], 
    b : 10, 

    t: function() 
    { 
     y = this.a; 
     z = this.b; 
     y[0]++; 
     z++; 
     alert('this.a[0] = ' + this.a[0] + '\nthis.b = ' + this.b) 
    } 
} 

SPC.t(); 
SPC.t(); 
</script> 

Запуск его в браузере будут отображаться два Уведомления коробки с:

this.a [0] = 11 this.b = 10

и

this.a [ 0] = 12 this.b = 10

Вопрос в том, почему значение this.a [0] увеличивается? Я назначаю «y = this.a» и обновляю элемент «y» как «y [0] ++;»?

В то же время точно так же происходит с «b»: «z = this.b; z ++». Тем не менее, «this.b» остается равным 10.

Как изменить значение «y [0]» в локальной области, не затрагивая «this.a»?

Любые идеи?

Спасибо!

ответ

7

a - массив, и вы просто копируете ссылку на массив в y. Вам нужно скопировать содержимое массив a «s в новый массивy вместо (с использованием Array.slice() (y = a.slice() в вашем случае) является самым простым способом).

(Или, если вам нужно только a[0], вы можете установить y = a[0]. Последующие изменения в y не повлияет на a[0], так как вы копируете значение).

Смотрите «Javascript Массивы присвоенных По ссылке» и Раздел «Передача массивов как значений» this article для получения дополнительной информации.

0

Вы назначаете адресное значение массива a и b в y и z. поэтому y и z становятся точной копией a и b. вместо назначения значения адреса в y и z. вам просто нужно принять содержание значения а и Ь, и назначить их в у и г у = а [0]

г = Ь [0]

, а затем у ++

2

Попробуйте Array.slice() функцию ,

y = this.a.slice() 

Это создаст копию a массива и присвоить его y. Таким образом, модификация y не повлияет на a.

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