javascript中有指针吗?

时间:2013-06-29 16:40:25

标签: javascript pointers

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

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

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

6 个答案:

答案 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)

试试这个:

&#13;
&#13;
//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;
&#13;
&#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