之前我使用过C ++,我意识到指针非常有用。 javascript中有什么东西像指针一样吗? javascript有指针吗?当我想使用类似的东西时,我喜欢使用指针:
var a = 1;
var b = "a";
document.getElementById(/* value pointed by b */).innerHTML="Pointers";
我知道这是一个非常简单的例子,我可以使用a
,但是有几个更复杂的例子我会发现指针非常有用。有什么想法吗?
答案 0 :(得分:56)
不,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 :(得分:28)
你打赌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不同,你不能看到指针的实际地址和指针的实际值,你只能取消引用它(在它指向的地址获取值。)
答案 2 :(得分:1)
我刚刚做了一件很奇怪的事情,但也奏效了。
不传递指针,而是传递一个将其参数填充到目标变量中的函数。
var myTarget;
class dial{
constructor(target){
this.target = target;
this.target(99);
}
}
var myDial = new dial((v)=>{myTarget = v;});
这可能看起来有点邪恶,但效果很好。在这个例子中,我创建了一个通用表盘,它可以以这个小函数“(v)=>{target = v}”的形式分配任何目标。不知道它在性能方面的表现如何,但它的表现非常出色。
答案 3 :(得分:0)
由于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 :(得分:-3)
试试这个:
//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";
&#13;
<div id="1"></div>
<div id="2"></div>
&#13;
答案 5 :(得分:-6)
技术上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