2013-06-29 21 views
23

Prima ho usato C++ e ho capito che i puntatori erano molto utili. C'è qualcosa in javascript che si comporta come un puntatore? Javascript ha dei puntatori? Mi piace usare i puntatori quando voglio usare qualcosa come:Ci sono dei puntatori in javascript?

var a = 1; 
var b = "a"; 
document.getElementById(/* value pointed by b */).innerHTML="Pointers"; 

So che questo è un esempio estremamente semplice e ho potuto solo usare a, ma ci sono diversi esempi più complessi, dove avrei trovato i puntatori molto utile . Qualche idea?

+3

Mmh ... in generale non è necessario disporre di indicatori. Puoi dare un esempio più realistico di un caso che hai incontrato in cui i puntatori sarebbero stati utili? – Ryan

+0

Possibile duplicato di [Puntatori in JavaScript?] (Http://stackoverflow.com/questions/10231868/pointers-in-javascript) –

risposta

42

No, JS non ha puntatori.

Gli oggetti vengono passati passando una copia di un riferimento. Il programmatore non può accedere a nessun "valore" simile a C che rappresenta l'indirizzo dell'oggetto.

All'interno di una funzione di uno può cambiare il contenuti di un oggetto passato attraverso tale riferimento, ma non è possibile modificare il riferimento che il chiamante ha avuto, perché il riferimento è solo una copia:

var foo = {'bar': 1}; 

function tryToMungeReference(obj) { 
    obj = {'bar': 2}; // won't change caller's object 
} 

function mungeContents(obj) { 
    obj.bar = 2;  // changes _contents_ of caller's object 
} 

tryToMungeReference(foo); 
foo.bar === 1; // true - foo still references original object 

mungeContents(foo); 
foo.bar === 2; // true - object referenced by foo has been modified 
+1

Che cos'è un _copy di un riferimento_, può essere utilizzato come puntatori e come lo uso? ? –

+0

@ user2297366 vedi aggiornamento per rispondere – Alnitak

+1

Il riferimento è il nome dell'oggetto, la copia è fondamentalmente un nuovo nome che punta allo stesso indirizzo – Mataniko

15

puoi scommettere ci sono dei puntatori in JavaScript; gli oggetti sono puntatori.

//this will make object1 point to the memory location that object2 is pointing at 
object1 = object2; 

//this will make object2 point to the memory location that object1 is pointing at 
function myfunc(object2){} 
myfunc(object1); 

Se una posizione di memoria non viene più indicata, i dati verranno persi.

differenza in C, non si può vedere l'indirizzo reale del puntatore, né il valore effettivo del puntatore, si può solo dereferenziarlo (ottenere il valore all'indirizzo a cui punta.)

0

Tecnicamente JS non ha i puntatori, ma ho scoperto un modo per imitare il loro comportamento;)

var car = { 
    make: 'Tesla', 
    nav: { 
     lat: undefined, 
     lng: undefined 
    } 
}; 

var coords: { 
    center: { 
     get lat() { return car.nav.lat; }, // pointer LOL 
     get lng() { return car.nav.lng; } // pointer LOL 
    } 
}; 

car.nav.lat = 555; 
car.nav.lng = 777; 

console.log('*** coords: ', coords.center.lat); // 555 
console.log('*** coords: ', coords.center.lng); // 777 
+3

Restituisci solo le proprietà della 'macchina '. Non ha nulla a che fare con i puntatori o imitare ed è noto come 'scope' –

1

Prova questo:

//MaybePointer Lib 
 
function MaybePointer(v){ 
 
    this.val = v; 
 
} 
 
MaybePointer.prototype.valueOf = function(){ return this.val }; 
 

 
//Your code 
 
var a = new MaybePointer(1); 
 
var b = a; 
 
document.getElementById(b+'').innerHTML="Pointers 1"; 
 

 
var c = new MaybePointer(2); 
 
var b = c; 
 
document.getElementById(b+'').innerHTML="Pointers 2";
<div id="1"></div> 
 
<div id="2"></div>

Problemi correlati