65

我以前使用过 C++,我意识到指针非常有用。javascript中有什么东西可以像指针一样起作用吗?javascript有指针吗?当我想使用类似的东西时,我喜欢使用指针:

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

我知道这是一个非常简单的示例,我可以只使用a,但是还有几个更复杂的示例,我会发现指针非常有用。有任何想法吗?

4

5 回答 5

109

不,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
于 2013-06-29T16:42:18.870 回答
54

你敢打赌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 不同,您看不到指针的实际地址,也看不到指针的实际值,您只能取消引用它(获取它指向的地址处的值。)

于 2015-05-12T04:01:15.160 回答
4

我刚刚做了一件奇怪的事情,也成功了。

与其传递指针,不如传递一个将其参数填充到目标变量中的函数。

var myTarget;

class dial{
  constructor(target){
    this.target = target;
    this.target(99);
  }
}
var myDial = new dial((v)=>{myTarget = v;});

这可能看起来有点邪恶,但效果很好。在这个例子中,我创建了一个通用表盘,可以通过这个小函数“(v)=>{target = v}”的形式为它分配任何目标。不知道它在性能方面会做得如何,但它表现得很漂亮。

于 2021-04-08T03:04:30.167 回答
2

由于 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})
于 2019-06-14T08:14:49.090 回答
-8

从技术上讲,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
于 2016-05-27T18:34:01.783 回答