Différence de traitement entre variable et tableau en JavaScript

Voici un code :

test = function(a){
return a - 1;
}
toto = function(){
var b = 2;
document.write(b); //affiche 2
test(b);
document.write(b); //affiche 2
b = test(b);
document.write(b); //affiche 1
}
toto();

Et un autre :

test = function(a){
a[1] = a[1]-1;
return a;
}
toto = function(){
var b = new Array(2,3);
document.write(b[1]); //affiche 3
test(b);
document.write(b[1]); /affiche 2
b = test(b);
document.write(b[1]); //affiche 1
}
toto();

Pourquoi n’y a-t-il pas besoin de réaffectation pour que la valeur de b[1] change ?
Je croyais que lors de l’appel à une fonction, cette fonction travaillait sur une copie des variables passées en paramètres, ce qui semble est le cas pour des variables “simples”, mais pas pour les tableaux ?

Parce qu’un tableau est passé par référence, une variable par copie. ie: dans le cas du tableau, tu modifies ton contenu directement. (et en fait, on pourrait dire que c’est le “pointeur sur le tableau” qui est passé en copie, bien que cela ne s’applique pas vraiment à Javascript).

Merci pour l’explication.

C’est aussi le cas en C++ ?
Lorsque j’en faisais (il y a longtemps), je n’avait pas l’impression que ça fonctionnait comme ça ! (Bon, j’étais jeune, j’ai peut-être loupé quelque chose à l’époque)

En C++ c’est pareil. Un tableau est un pointeur. Et il n’est passé par copie que si tu lui donne une taille :

int foobar(int v[30]) {…}