javascript中有指针吗?

IT技术 javascript pointers
2021-01-16 17:19:40

我之前使用过 C++,我意识到指针非常有用。javascript 中是否有任何类似指针的东西?javascript 有指针吗?当我想使用以下内容时,我喜欢使用指针:

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

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

5个回答

不,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
@user2297366 它只是一个表示对象内容的占位符,而不是对对象本身的引用。
2021-03-13 17:19:40
什么是引用副本,它可以像指针一样使用,我该如何使用它?
2021-03-19 17:19:40
reference是对象的名字,copy基本上就是一个指向同一个地址的新名字
2021-03-19 17:19:40
“引用副本”占用多少内存?它基本上只是一个可以找到实际对象的地址,还是在内存中分配了另一个空间来复制对象?
2021-03-22 17:19:40
哦。我现在明白了。非常感谢。
2021-03-30 17:19:40

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

Javascript 将对象传递给函数有点有趣。如果函数一次改变对象的一个​​成员,则它是通过引用传递的。但是,如果您尝试使用花括号完全更改对象,则它似乎是按值传递的。我猜这是因为当你执行 = {...} 时,Javascript 会自动认为你正在创建一个新对象,基本上是创建一个与参数同名的局部变量。
2021-03-13 17:19:40
第一部分工作 100%。var object1 仅指向 object2。如果我们更改 object1,则 object2 实际更改。当我们检查 object1 的内容时,直接更改 object2 也很好地显示了。它将显示 object1 也发生了变化,因为它指向内存中的相同数据。我已经测试过了。我不明白第二部分,但没关系。
2021-03-18 17:19:40
正如您明确说的,这实际上与创建新对象无关。我了解到这是关于始终传递引用:当您执行 objX = {..} 时,您实际上将引用传递给新创建的对象。当您执行 objX = objY 时,您会将引用传递给已经存在的 objY 对象。但是 = 实际上总是传递赋值运算符右侧的对象所在的地址(无论它是新创建的还是已经存在的对象 - 赋值运算符的右侧首先解析)。
2021-03-26 17:19:40
@user3015682 不,JavaScript 是按值传递,而不是按引用传递。JavaScript 在底层确实有“指针”。指针只是存储对象地址的变量。它们是按值传递的。因此,您可以修改所指向的对象,但不能通过将其传递给函数来强制该对象指向其他内容。
2021-04-03 17:19:40
好点子!经过一些测试我了解了更多,它实际上总是通过引用传递,只是注意不要更改它的地址。
2021-04-05 17:19:40

我也做了一件很奇怪的事情。

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

var myTarget;

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

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

由于 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})

从技术上讲,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
技术上JS是什么,但指针。但是,您只能取消引用它们,而不能操作指针本身。
2021-03-22 17:19:40
您只需返回car. 它与指针或模仿无关,被称为scope
2021-03-23 17:19:40