Почему ES6 копирует переменные класса внутри методов? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть JavaScript / ES6 class с членом, который является массивом с именем x, инициализированным [1,2,3,4].

Когда я объявляю новую переменную в методе с именем y, присваиваю ей x, а затем изменяю значения в x, y остается неизменным, указывая, что yявляется копией x.

Если я объявил и присвоил y переменной с именем z в том же методе, изменение z изменит y, но не изменит x.

Это будет означать, что объявление массива уровня класса (объекта?) И последующее присвоение его переменной внутри метода копирует объект.Это значительно отличается от языков, таких как C #.

Почему это реализовано в JavaScript / ES6?

class Alpha {
  constructor() {
    this.x = [1, 2, 3, 4];
  }

  DoSomething() {

    console.log('x is ' + this.x); // x is 1,2,3,4

    let y = this.x;
    this.x = [99, 99, 99, 99];

    console.log('x is ' + this.x); // x is 99,99,99,99
    console.log('y is ' + y); // y is 1,2,3,4 (?)

    let z = y;
    z[1] = 888;

    console.log('x is ' + this.x); // x is 99,99,99,99
    console.log('y is ' + y); // y is 1,888,3,4
    console.log('z is ' + z); // z is 1,888,3,4

  }
}

let thing = new Alpha();
thing.DoSomething()

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Это то, как память хранит значения и как переменные указывают на разные значения в памяти.

 Statement                 Value of x              Value of y
+------------------------+---------------------+-------------------+
|  let x = [1, 2, 3, 4]; |  [1, 2, 3, 4]       |                   |
|  let y = x;            |  [1, 2, 3, 4]       |   [1, 2, 3, 4]    |
|  x = [99, 99, 99, 99]; |  [99, 99, 99, 99]   |   [1, 2, 3, 4]    |
+------------------------+---------------------+-------------------+

В основном, две переменные содержат / указывают на разные значения, поэтому изменения в одной переменнойне повлияет на других.

0 голосов
/ 26 февраля 2019

Это не имеет ничего общего с классом или методами класса, и это всегда существовало в javascript. let tab_origin = [ "aa", "bb", "cc" ]; let same_tab = tab_origin;

это заставляет tab_origin и same_tab указывать на один и тот же адрес массива.другими словами, у вас есть только один массив и две разные переменные для доступа к нему. same_tab[0] = "zz"; console.log( tab_origin[0] ); // => "zz"

будьте осторожны с этим для функций: function myfunction(inTab) { inTab[1] = "ff" }<br> myfunction(tab_origin); console.log( tab_origin[1] ); // => "ff" !!

, поэтому, если вы хотите получить копию вашего массива, вы должны сделать: let other_tab = Object.assign( [], tab_origin ); , как следует из названия, этот метод позволяетназначить новый объект other_tab[2] = "xy"; console.log( tab_origin[2] ); // => "cc" - unchanged :) console.log( other_tab[2] ); // => "xy"

let tab_origin = [ "aa", "bb",  "cc" ];

let same_tab = tab_origin; 

same_tab[0] = "zz";
console.log( 'tab_origin[0]', tab_origin[0] ); // => "zz"

function myfunction(inTab)
{ 
  inTab[1] = "ff";
}  

myfunction(tab_origin);
console.log( 'tab_origin[1]', tab_origin[1] ); // => "ff"

let other_tab = Object.assign( [], tab_origin ); 


other_tab[2] = "xy";
console.log( 'tab_origin[2]', tab_origin[2] ); // => "cc"
console.log( 'other_tab[0]',  other_tab[2] );  // => "xy"
0 голосов
/ 26 февраля 2019
let y = this.x;
this.x = [99, 99, 99, 99];

y теперь указывает на [1,2,3,4] .... this.x теперь указывает на новый массив [99,99,99,99];

РЕДАКТИРОВАТЬ

Для записи, это не имеет никакого отношения к ES6

РЕДАКТИРОВАТЬ # 2

yтеперь указывает на место в памяти, которое содержит массив [1,2,3,4], а this.x теперь указывает на другое место в памяти, которое содержит массив [99,99,99,99];

В основе этого вопроса лежит понимание распределения памяти.

...