И то, и другое! Давайте выясним, как это делается.
Передача по значению
При вызове функции, если значение переменной передается непосредственно как параметр, то изменения, внесенные в этот параметр, не распространяются за пределы функции.
Все примитивные типы данных в javascript передаются по значению.
Пример
var a=10;
console.log("Value of 'a' before method called: "+a);
add(a);
function add(a){
a++;
console.log("Value of 'a' inside the method call: "+a);
}
console.log("Value of 'a' outside the method called: "+a);
/*
Output:
Value of 'a' before method called: 10
Value of 'a' inside the method call: 11
Value of 'a' outside the method called: 10
*/
Передача по ссылке
Если при вызове функции в качестве параметра передается непосредственно адрес переменной, а не создается ее копия и передается только значение, то это передача по ссылке. Поскольку мы все еще ссылаемся на адрес внутри функции, любое изменение, сделанное с переменной внутри функции, будет передано по всей программе.
Объекты и массивы передаются по ссылке в javascript
Пример
var user={
id:1,
firstName:"John",
lastName:"Doe"
}
console.log("Value of 'user' before method called: "+user.firstName+" "+user.lastName);
print(user);
function print(user){
user.lastName="Wick";
console.log("Value of 'user' inside the method call: "+user.firstName+" "+user.lastName);
}
console.log("Value of 'user' outside the method call: "+user.firstName+" "+user.lastName);
/*
Output:
Value of 'user' before method called: John Doe
Value of 'user' inside the method call: John Wick
Value of 'user' outside the method call: John Wick
*/