2013-06-29 4 views
23

Я использовал C++ раньше, и я понял, что указатели были очень полезными. Есть ли что-нибудь в javascript, который действует как указатель? У javascript есть указатели? Мне нравится использовать указатели, когда я хочу использовать что-то вроде:Есть ли указатели в javascript?

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

Я знаю, что это очень простой пример, и я мог бы просто использовать a, но есть несколько более сложных примеров, где я бы найти указатели очень полезно , Есть идеи?

+3

Mmh ... вам обычно не нужны указатели. Можете ли вы дать более реальный пример случая, с которым вы столкнулись, когда указатели будут полезны? – Ryan

+0

Возможный дубликат [Указатели в JavaScript?] (Http://stackoverflow.com/questions/10231868/pointers-in-javascript) –

ответ

42

Нет, JS не имеет указателей.

Объекты переданы путем пропуска копия ссылки. Программист не может получить доступ к C-подобному «значению», представляющему адрес объекта.

Внутри функции можно изменить содержимого из на переданном объекте с помощью этой ссылки, но вы не можете изменить ссылку, что абонент имел, потому что ваша ссылка только копия:

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

Что такое _copy ссылки_, может ли он использоваться как указатели и как его использовать? ? –

+0

@ user2297366 см. Обновление для ответа – Alnitak

+1

Ссылка на имя объекта, копия - это в основном новое имя, указывающее на тот же адрес – Mataniko

15

Вы делаете ставку есть указатели в JavaScript; объекты - указатели.

//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); 

Если местоположение памяти больше не указано, данные там будут потеряны.

В отличие от C, вы не можете видеть фактический адрес указателя, ни фактическое значение указателя, вы можете только разыменования его (получить значение по адресу, на который она указывает.)

0

Технически JS нет указателей, но я нашел способ имитировать их поведение;)

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

Вы просто возвращаете свойства 'car'. Он не имеет ничего общего с указателями или имитацией и известен как «область» –

1

Попробуйте это:

//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>