0
votes

En javascript, le tableau affiche un comportement «passer par valeur» au lieu de «passer par référence»

Je sais que le tableau étant un objet en javascript, en fait des types de données non primitifs, ce qui par défaut en fait un passage par référence. Maintenant, cela est vrai dans la plupart des cas utilisés que j'ai rencontrés, mais le code que je partage montre un comportement étrange que je ne comprends pas et cela ressemble plus à un `` type de passage par valeur ''.

var arr = ['a','b','c']
/*
function addArr(ar){
    ar.push('d')
    return ar
}

console.log(addArr(arr))  // ['a', 'b', 'c', 'd']
console.log(arr)          // ['a', 'b', 'c', 'd']
*/

//the above output is expected behavior for an Array object



function changeArr(ar){

    console.log(ar)   //1-// ['a', 'b', 'c']
    ar = ['12','11']
    console.log(ar)   //2-// ['12', '11']
    return ar
}

console.log(changeArr(arr)) //3-// ['12', '11']
console.log(arr)            //4-// ['a', 'b', 'c']

//now I expect the forth console output to be  ['12','11'] here because it is an object


3 commentaires

Double-possible de JavaScript est-il un pass-by- un langage de référence ou de passage par valeur?


Vous avez affecté un nouveau tableau à la référence simplement pour en faire un nouvel objet.


JavaScript est toujours passé par valeur. Cependant, la valeur d'un objet est sa référence. Pourtant, si vous réaffectez la variable , vous ne changez pas l'objet à la fin de la référence .


3 Réponses :


0
votes
var arr = [1,2,3,4];
console.log(changeArr());
console.log(arr);

2 commentaires

ok cela le rend clair, donc je crée un nouveau tableau à l'intérieur de la fonction qui n'est pas lié au paramètre de fonction et donc les deux objets sont différents, mais je n'ai jamais déclaré l'ar à l'intérieur de la fonction. Je veux dire qu'il devrait y avoir une sorte de déclaration comme 'var ar = ["12", "11"]' à l'intérieur de la fonction changeArr, pour indiquer que ce n'est pas le même tableau. Bien que le code se comporte de la même manière même si j'utilise 'var ar = ["12", "11"]' ou 'ar = ["12", "11"]'


Vous n'avez pas besoin de spécifier un mot clé var pour déclarer quelque chose. Ouvrez votre console et saisissez ar = ['12', '11'] . Deuxièmement, observation des variables . Foutus ordinateurs, ils font toujours exactement ce que vous leur dites de faire et jamais ce que vous voulez qu'ils fassent :)



0
votes

En gros, vous réaffectez l'objet et ne modifiez pas l'objet d'origine.

ar = ['12','11']

C'est pourquoi Javascript attribue une nouvelle valeur.


0 commentaires

0
votes

Veuillez lire les commentaires.

let arr = [1, 2, 3, 4];

function changeArr(ar) {

  //console.log(ar)
  ar = ['12', '11'] // creating a new array ie creating a new space in heap putting these values there and storing its reference in ar or assigning it to the reference 
  //console.log(ar)
  return ar
}

function changeArr2(ar) {


  ar.push(55); // here we have changed the array  that is pointed by the reference stored in ar

  return ar
}

console.log(changeArr(arr))
console.log(changeArr2(arr));
console.log(arr) // now the original array contains 55 too

Pour une image plus claire, regardez ici - https://stackoverflow.com/a/57852144/7849549


0 commentaires