Передача параметров по значению и по ссылке

Передача параметров по значению

Строки, числа, логические значения передаются в функцию по значению. Иными словами при передаче значения в функцию, эта функция получает копию данного значения. Рассмотрим, что это значит в практическом плане:

function change(x){
	x = 2 * x;
	console.log("x in change:", x);
}

var n = 10;
console.log("n before change:", n);	// n before change: 10
change(n);							// x in change: 20
console.log("n after change:", n);	// n after change: 10

Функция change получает некоторое число и увеличивает его в два раза. При вызове функции change ей передается число n. Однако после вызова функции мы видим, что число n не изменилось, хотя в самой функции произошло увеличение значения параметра. Потому что при вызове функция change получает копию значения переменной n. И любые изменения с этой копией никак не затрагивают саму переменную n.

Передача по ссылке

Объекты и массивы передаются по ссылке. То есть функция получает сам объект или массив, а не их копию.

function change(user){
	user.name = "Tom";
}

var bob ={ 
	name: "Bob"
};
console.log("before change:", bob.name);	// Bob
change(bob);
console.log("after change:", bob.name);		// Tom

В данном случае функция change получает объект и меняет его свойство name. В итоге мы увидим, что после вызова функции изменился оригинальный объект bob, который передавался в функцию.
Однако если мы попробуем переустановить объект или массив полностью, оригинальное значение не изменится.

function change(user){
	// полная переустановка объекта
	user= {
		name:"Tom"
	};
}

var bob ={ 
	name: "Bob"
};
console.log("before change:", bob.name);	// Bob
change(bob);
console.log("after change:", bob.name);		// Bob

То же самое касается массивов:

function change(array){
	array[0] = 8;
}
function changeFull(array){
	array = [9, 8, 7];
}

var numbers = [1, 2, 3];

console.log("before change:", numbers);		// [1, 2, 3]
change(numbers);
console.log("after change:", numbers);		// [8, 2, 3]
changeFull(numbers);
console.log("after changeFull:", numbers);