Есть ли указатели в javascript?
Я использовал С++ раньше, и я понял, что указатели очень полезны. Есть ли что-нибудь в javascript, который действует как указатель? У javascript есть указатели? Мне нравится использовать указатели, когда я хочу использовать что-то вроде:
var a = 1;
var b = "a";
document.getElementById(/* value pointed by b */).innerHTML="Pointers";
Я знаю, что это очень простой пример, и я мог бы просто использовать a
, но есть несколько более сложных примеров, где я бы нашел, что указатели очень полезны. Любые идеи?
Ответы
Ответ 1
Нет, у JS нет указателей.
Объекты передаются путем передачи копии ссылки. Программист не может получить доступ к какому-либо C-подобному "значению", представляющему адрес объекта.
Внутри функции можно изменить содержимое переданного объекта через эту ссылку, но вы не можете изменить ссылку, которая была у вызывающей стороны, потому что ваша ссылка является только копией:
var foo = {'bar': 1};
function tryToMungeReference(obj) {
obj = {'bar': 2}; // won't change caller object
}
function mungeContents(obj) {
obj.bar = 2; // changes _contents_ of caller 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
Ответ 2
Вы ставите, что в 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, вы не можете видеть фактический адрес указателя или фактическое значение указателя, вы можете только разыменовать его (получить значение по адресу, на который он указывает.)
Ответ 3
из-за природы JS, который передает объекты по значению (если ссылочный объект полностью изменен) или по ссылке (если поле ссылочного объекта изменено), невозможно полностью заменить ссылочный объект.
Однако, давайте использовать то, что доступно: замена отдельных полей ссылочных объектов. Таким образом, следующая функция позволяет достичь того, что вы просите:
function replaceReferencedObj(refObj, newObj) {
let keysR = Object.keys(refObj);
let keysN = Object.keys(newObj);
for (let i = 0; i < keysR.length; i++) {
delete refObj[keysR[i]];
}
for (let i = 0; i < keysN.length; i++) {
refObj[keysN[i]] = newObj[keysN[i]];
}
}
Для примера, приведенного user3015682, вы бы использовали эту функцию следующим образом:
replaceReferencedObj(foo, {'bar': 2})
Ответ 4
Попробуйте следующее:
//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>
Ответ 5
Технически 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