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 Réponses :
var arr = [1,2,3,4]; console.log(changeArr()); console.log(arr);
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 :)
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.
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
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 .