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]) {…}