Según tengo entendido, en Javascript los objetos y las matrices se pasan como referencias y no como valores para los argumentos de las funciones. Un grupo jQuery es un objeto y, por lo tanto, se debe pasar como referencia.El objeto jQuery pasado como argumento a la función es copia de valor no referencia?
Sin embargo, encuentro en el script de prueba a continuación que algo extraño está sucediendo; el grupo jQuery se comporta como un valor, no como una referencia, a menos que esté envuelto en otro objeto ... ¿alguien puede explicar esto?
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
<script>
function test(arg){
arg = arg.add($('<span/>'))
console.log(arg);
};
ele = $('<div/>');
test(ele); // div + span in the group as expected
console.log(ele); // only the div - the 'arg' param in function was a copy
function test2(arg){
arg.a = arg.a.add($('<span/>'));
console.log(arg.a);
};
obj = {a:ele};
test2(obj); // div + span in the group as expected
console.log(obj.a); // both in the group - arg acted like a reference!
</script>
</body>
</html>
* Esta es una "característica" del método .add(). * - hace que suene como si fuera posible con otro método si estuviera codificado como tal. El hecho es que se establece un nuevo valor para la variable 'arg' dentro de la función y no modifica la variable' ele' en el alcance externo que el OP cree que se ha pasado en "referencia". –
@Andy E - En realidad es posible. Daré otro ejemplo usando el código original de OP, pero con 'push()' en su lugar. Modifica correctamente el objeto jQuery y las referencias 'ele' que cambiaron el objeto. – user113716
@Andy E - Ok, tal vez estoy malinterpretando el significado correcto de * "pasar por referencia" *. Cuando pasas una variable, pasas una referencia a su valor, que creo que es el mismo tipo de cosas que verías en otros lenguajes orientados a objetos como Java, por ejemplo. ¿Estoy equivocado? En cualquier caso, ambas soluciones ilustran los conceptos adecuados dentro de javascript. – user113716