В JavaScript содержимое переменных не копируется, а делается ссылка?

Рейтинг: 1Ответов: 1Опубликовано: 27.04.2015

Правильно ли я понимаю, что в JS содержимое переменных не копируется, а делается ссылка?

Например такой код:

var testjson = {'Zero' :'0','One':'1','Two':'2'};
var test_var = testjson;
console.log(test_var);
test_var.Zero = '000'
console.log(test_var);
console.log(testjson);

Он вернёт:

{ Zero: '0', One: '1', Two: '2' }
{ Zero: '000', One: '1', Two: '2' }
{ Zero: '000', One: '1', Two: '2' }

Можно ли просто скопировать переменную не трогая её саму, как я понимаю это нужно делать через new?

Function testjson(){
var myvar = 'Zero' :'0','One':'1','Two':'2'
return myvar;
}

var test_var = new testjson();

Есть ли варианты попроще???

Ответы

▲ 1Принят

Читаем, вникаем, понимаем - по ссылке передаются только объекты, примитивные типы копируются.

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

Клонирование:

function clone(o) {
 if(!o || ‘object’ !== typeof o)  {
   return o;
 }
 varc = ‘function’ === typeof o.pop ? [] : {};
 var p, v;
 for(p in o) {
 if(o.hasOwnProperty(p)) {
  v = o[p];
  if(v && ‘object’ === typeof v) {
    c[p] = clone(v);
  }
  else {
    c[p] = v;
  }
 }
}
 return c;
}

var o = { a:1, get:function(){ alert(this.arr[1]);}, arr: [1,2,3] };
var c = clone(o); // делаем клон объекта
c.arr[0] = 77;
c.arr[1] = 88;
c.arr[2] = 99;

// Значения остались прежними
alert(o.arr[0]); // 1
alert(o.arr[1]); // 2
alert(o.arr[2]); // 3

// Методы тоже были скопированы
c.get(); // 88
o.get(); // 2

Пруф.

Object.prototype.clone = function() {
	var f = function () {};
	f.prototype = this;
	var g = new f();
	g.prototype = this;
	return g;
}

var man = { name: "asdf", age: 21, sayHello: function () { alert("Hello, World!!!"); } };

var me = man.clone();

alert(me.name + " is " + me.age + " year old!");

me.sayHello();

Пруф.