Por qué javascript "for loop" tiene diferentes comportamientos para diferentes types de objects

Me doy count de que JavaScript no tiene pointers, sin embargo, noté este comportamiento de "puntero" al recorrer las matrices que contienen objects, pero no el comportamiento similar cuando una matriz contiene numbers (por ejemplo).

var ARR_num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; for (var i = 0, len = ARR_num.length; i < len; i++) { var item = ARR_num[i]; item++; } console.log(ARR_num); //Outputs [0,1,2,3,4,5,6,7,8,9] 

Ahora con una matriz con objects

 var ARR_obj = [{}, {}, {}]; for (var i = 0, len = ARR_obj.length; i < len; i++) { var item = ARR_obj[i]; item.pointer = true; } console.log(ARR_obj); //Outputs [{pointer: true}, {pointer: true}, {pointer: true}] 

¿Por qué estos dos comportamientos distintos?

¿Por qué estos dos comportamientos distintos?

cuando asigna un object a otra variable, la nueva variable apunta a los mismos objects, por lo tanto, cuando cambia las properties de las nuevas variables, el object obtiene un ejemplo mutado:

 var a= {name: "some"}; var b = a; b.name = "newName"; console.log(a.name);// "newName" 

cuando asigna un tipo primitivo a otra variable, solo es una nueva variable y no tiene reference a la variable anterior, por lo tanto, cambiar la nueva variable no afectará a la anterior. ejemplo:

 var a = "some"; var b = a; b = "newName"; console.log(a);//"some" 

¡Espero que esto ayude!

{} es la syntax literal del object, que crea (en su caso) nuevos objects en una matriz. Al recorrerlo y usar ARR_obj [i], obtiene el object al que se hace reference, que luego se manipula.

O para poner esto en otras palabras (más generales):

Los primitivos (indefinido, nulo, boolean, cadena y número) se pasan por valor, mientras que los Objetos pasan por references (o para ser precisos por una copy de la reference).

¿Por qué estos dos comportamientos distintos?

Porque tienes dos operaciones distintas. En este último, estás mutando el estado del object

 item.pointer = true; 

item sigue apuntando al mismo object. Solo se cambian las partes internas del object.

Pero aquí

 item++; # equivalent to item = item + 1 

reasigna el artículo. Apuntará a otro integer después de la operación. Si realiza operaciones similares en el bucle de object

 item = { pointer: true } 

Entonces sus elementos de matriz originales no se verán afectados, y no observará ninguna "semántica de puntero".

Y sí, también tiene algo que ver con que los integers sean valores primitivos / inmediatos.

Como sabemos, todos los valores (que no son primitivos) son pointers de object. Entonces, item es un puntero a object en el caso de uso 2 donde, como en el caso de uso 1, es su número integer.

En el caso de uso 2, se refiere al valor "verdadero" para todas las iteraciones. así que según el código escrito, da el resultado correcto.

en general, JavaScript no admite el paso de parameters por reference, por lo que al usar Objetos en Javascript, podemos pasar una reference.