Estoy buscando un buen material de lectura exhaustivo sobre cuándo JavaScript pasa algo por valor y cuándo por referencia y cuando modificar un artículo pasado afecta el valor fuera de una función y cuando no. También me interesa cuando la asignación a otra variable es por referencia vs. valor y si eso sigue reglas diferentes que pasar como un parámetro de función.Javascript por referencia vs. por valor
He realizado muchas búsquedas y he encontrado muchos ejemplos específicos (muchos de ellos aquí en SO) a partir de los cuales puedo comenzar a juntar partes de las reglas reales, pero todavía no he encontrado ninguno, documento bien escrito que lo describe todo.
Además, ¿hay formas en el lenguaje para controlar si algo se pasa por referencia o por valor?
Estos son algunos de los tipos de preguntas que quiero entender. Estos son solo ejemplos: en realidad estoy buscando entender las reglas que usa el lenguaje, no solo las respuestas a ejemplos específicos. Pero, he aquí algunos ejemplos:
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
Cuando son los contenidos de x, y, z cambiado fuera del alcance de f para todos los diferentes tipos?
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}];
var b = a[1];
a[1].red = "tan";
// what is the value of b now and why?
b.red = "black";
// did the value of a[1].red change when I assigned to b.red?
}
Si quiero hacer una copia completamente independiente de un objeto (no hay referencias de ningún tipo), ¿cuál es la mejor manera práctica de hacerlo?
Esta es una lectura muy recomendable: [wiki: Estrategia de Evaluación] (http://en.wikipedia.org/wiki/Evaluation_strategy). Prefiero Call By Object Sharing para evitar tal confusión y dejar Call By Reference para realmente significar algo más, donde se aplique. Para hacer un "clon", considere 'jQuery.extend' (clon superficial solo!) O similar proporcionado por su elección de marco. (Creo que ECMA ed.5 introduce 'Object.clone' ...?). Se puede lograr un "clon profundo" con la serialización a JSON y viceversa, donde dicha operación se conserva (puede que no siempre sea así). Estoy seguro de que también hay otras funciones diseñadas para esto :) –
Creo que jQuery.extend ahora (1.8.x +) admite la clonación profunda (utilizando un parámetro booleano opcional) –
En los años transcurridos desde esta pregunta, he descubierto que es Es más fácil explicar este problema a los novatos de JavaScript (particularmente a las personas que conocen C/C++) al decir esto: "En Javascript, los objetos se pasan por puntero y todo lo demás se pasa por valor". – jfriend00