2012-06-12 28 views
5

¿por qué los dos scripts son diferentes? lo que quiero es el primer guión, pero en el segundo drawData() cambia los datos, es extraño. ¿alguien puede decirme por qué es y cómo solucionarlo? ¡gracias!¿Cambiar la matriz en la función de JavaScript cambia la matriz fuera de la función?

var data =   ["right"] ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs[0]="omg"; 
    } 
    alert(data[0]); 

} 
drawData(data); 
drawData(data,"percentage"); 

segundo:

var data =   "right" ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs="omg"; 
    } 
    alert(data); 

} 
drawData(data); 
drawData(data,"percentage"); 
+4

Es porque un objeto es en sí mismo. Cuando un objeto se modifica * ese * objeto se modifica. Cuando se pasa un valor (objeto) a una función ** no se copia, se clona o se duplica ** (internamente hay diferentes técnicas que se usan, pero esto es semánticamente correcto). Es decir, solo hay una matriz, y esa * misma * matriz se cambia dentro de la función. Si desea poder cambiarlo sin temor a afectar el exterior, primero haga una copia. Para una matriz simple, esto se puede hacer con 'Array.prototype.slice'. De lo contrario, las bibliotecas como jQuery tienen métodos de copia útiles. –

+0

Ah, y responda, ** antes de decir ** "pasar por referencia", lea [Estrategias de evaluación] (http://en.wikipedia.org/wiki/Evaluation_strategy) y busque el término "referencia" en el [Especificación ECMAScript] (http://es5.github.com/) y podrá hacer una copia de seguridad de sus opciones de palabras. ¡Gracias! –

+1

gracias, he encontrado algo interesante en [http://stackoverflow.com/](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone- a-javascript-object) solo mira la respuesta de John Resig. –

Respuesta

0

primera variante modifica pasado como parámetro a la función de objeto (que pasa a ser array) - por lo que este cambio se ve fuera de función. La segunda variante asigna un nuevo valor al parámetro de función (que pasa a ser referencia a una matriz) pero no cambia la matriz en sí misma.

+1

La respuesta es muy poco clara/críptica para esta pregunta y utiliza términos mal definidos: "¿cambios de referencia a este conjunto"? También mezcla el alcance (asignación de una variable local) con la mutabilidad del objeto (asignación de una propiedad en un objeto). –

Cuestiones relacionadas