Hoy respondí una pregunta sobre JavaScript, que implica problemas de asignación, por lo que quiero resumir este problema cuidadosamente.
La copia del código es la siguiente:
var a = 'prueba';
var b = function () {};
ba = 'prueba';
cambio de función (m, n) {
m = 'cambiar';
na = 'cambio';
}
cambio (a, b);
¿Cambiarán los valores de las variables A y B después de ejecutar el código anterior?
Valores originales y referenciados
He introducido el valor original y el valor de referencia en artículos anteriores. El valor original se refiere a indefinido, nulo, booleano, número, cadena, etc., que se almacenan en la pila, mientras que el valor de referencia se integra a partir del objeto, que se almacena en el montón.
Aquí necesitamos distinguir los dos:
La copia del código es la siguiente:
var a = 'prueba';
var b = nueva cadena ('test');
var a = 'verdadero';
var b = nuevo booleano ('verdadero');
Para las cuatro variables anteriores, A y A son los valores originales, mientras que B y B son los valores de referencia.
Mecanismo de asignación
Después de aclarar la diferencia entre el valor original y el valor de referencia, puede introducir el mecanismo de asignación de JavaScript en detalle:
En JavaScript, cada asignación generará una copia para las variables del tipo de valor original, y para los valores referenciados, como su nombre, se asigna por referencia a la memoria del mismo objeto de almacenamiento.
Asignación del valor original:
La copia del código es la siguiente:
var a = 1; // valor original
var b = a; // Generar una copia a la variable B
b = 2; // no está relacionado con un
alerta (a); // Salida 1
Asignación de valores referenciados:
La copia del código es la siguiente:
var a = nuevo objeto (); // valor de referencia
Ax = 1;
var b = a; // asignación de referencia, señalando la misma memoria
Bx = 2; // La modificación de B afectará un
alerta (ax); // Salida 2
Pase de parámetros
Ahora echemos un vistazo a cómo manejar el paso de dos tipos de valores para funcionar parámetros al mismo tiempo.
1. Pase el valor original
La copia del código es la siguiente:
var a = 1;
prueba de función (m) {
m = 2;
}
prueba (a);
alerta (a); // Salida 1
La salida es 1, por lo que sabemos que la función simplemente pasa el valor de la variable en, por lo que M en el cuerpo de la función obtiene el valor 1 y se asigna a 2. Este proceso no afecta la variable externa a.
2. Pase el valor de referencia
La copia del código es la siguiente:
var a = nuevo objeto ();
Ax = 1
prueba de función (m) {
Mx = 2;
}
prueba (a);
alerta (ax); // Salida 2
La salida es 2, por lo que sabemos que la función pasa la dirección de la variable en, por lo que M en el cuerpo de la función obtiene la dirección aprobada. Por lo tanto, cuando el atributo X se asigna a 2, también afectará una señal a la misma dirección de memoria.
Resumir
Ahora volvamos a la pregunta inicial:
La copia del código es la siguiente:
var a = 'prueba';
var b = function () {};
ba = 'prueba';
cambio de función (m, n) {
m = 'cambiar';
na = 'cambio';
}
cambio (a, b);
La variable A es el valor original, la variable B es el valor de referencia, y uno se pasa al cuerpo de la función como un valor y el otro es la dirección, por lo que después de ejecutar la función, la variable A no cambiará y el valor de la variable B cambiará.