2010-04-23 5 views
3

Pour autant que je peux voir dans une situation comme celle-ci:Pousser référence d'un objet à un tableau

var x = []; 
var y = {}; 

y.someProp='asd'; 

Ce travail ne marche pas:

x.push(y); 

Ce que je veux faire est d'ajouter une référence y à x de sorte que plus tard si je vais "supprimer y;" Je veux aussi qu'il soit retiré du tableau x.

Répondre

2

Vous mélangez des variables, des références et des objets.

L'exécution de delete y; supprime la variable y. Comme la variable n'existe plus, elle n'aura naturellement plus de valeur. Ainsi la référence que la variable contenue est parti.

La suppression de la variable ne supprimera toutefois pas en elle-même l'objet auquel elle faisait référence. Le tableau contient toujours une référence à l'objet, et aucun d'entre eux ne dépend de l'existence de la variable.

Il n'y a en réalité aucun moyen de retirer l'objet directement. Vous supprimez des objets en détruisant toutes les références, et non l'inverse. Vous voulez que l'objet supprime ses références, ce qui n'est tout simplement pas le cas.

+0

Il me suffira si je peux simplement supprimer la référence dans le tableau à l'objet d'un événement de l'objet lui-même. Puis-je en quelque sorte passer une référence de référence à l'objet? – intacto

+0

@Guffa, 'delete y' ne fonctionne que dans le contexte global, quand' y' est 'this.y'. Lisez ceci: http://perfectionkills.com/understanding-delete/ – James

+0

@intacto: Pour permettre même à l'objet de supprimer la référence du tableau, l'objet devrait contenir des références à tous les tableaux contenant des références à celui-ci. . Donc, lorsque vous ajoutez l'objet à un tableau, vous devez également ajouter le tableau à l'objet ... – Guffa

0

Ce n'est pas ainsi que fonctionne delete. Il supprimera la référence d'objet que vous lui passez - pas d'autres références au même objet. Vous cherchez quelque chose comme une "référence faible" ici et je ne suis pas au courant de toutes les façons de mettre en œuvre ceux en JavaScript.

0

Cela aiderait-il?

Var x=[{}]; var y=x[0];

Edit: Désolé, je suis un peu bref dans ma première tentative de répondre. Ce que je commencerais à demander est: pourquoi y a-t-il besoin d '"exister" en dehors du tableau en premier lieu? Ne pouvez-vous pas simplement créer un tableau d'objets et utiliser delete ou array.splice() pour supprimer l'objet lorsque vous en avez besoin? Deuxièmement, si y doit exister en dehors du tableau, vous devez créer une propriété faisant référence à l'index du tableau ou une fonction utilitaire qui peut parcourir le tableau pour trouver la référence d'objet correcte. retirer. En d'autres termes, quelque chose comme

var x=[]; var y={}; y.arrayIndex=(x.push(y)-1); 

// later on, you want to get rid of y 

delete x[y.arrayIndex]; delete y; 
+0

y est un objet passé par référence à une fonction, donc je ne peux pas utiliser quelque chose comme ça. – intacto

+0

Vous avez arrêté de répondre rapidement :), pendant ce temps, j'ai essayé d'améliorer ma suggestion. – hallvors

+0

(et même si vous passez l'objet à la fonction cela fonctionnerait bien pour faire func (x [0]); - non?) – hallvors

0

Ce travail ne marche pas:

x.push(y);

Bien sûr, il le fait, il fonctionnera exactement comme prévu - pousser la valeur de y au tableau que vous avez créé.

L'opérateur delete est spécifiquement conçu pour supprimer des propriétés sur des objets, si l'expression qui suit l'opérateur ne se résout pas à une propriété, alors rien ne se passe.

var y = {"someprop":true}; 

delete y; 
alert(y.someprop); // alerts "true" 

Essayez dans la fenêtre de votre navigateur, collez le texte suivant dans la barre d'adresse et appuyez sur Entrée:

javascript:var y = {"someprop":true}; delete y; alert(y.someprop); 
+0

Je l'ai eu merci. y at-il un moyen que je peux obtenir l'indice de l'élément nouvellement poussé? – intacto

+0

@intacto: 'push()' ajoute des éléments à la fin du tableau et la valeur de retour est la nouvelle longueur, donc si un seul élément est ajouté, l'index sera toujours 'array.push (item) - 1', par ex. 'var index = x.push (y) - 1;' –

Questions connexes