【问题标题】:Are there pointers in javascript?javascript中有指针吗?
【发布时间】:2013-06-27 06:33:06
【问题描述】:

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

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

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

【问题讨论】:

  • 嗯……您通常不需要指针。你能举一个更真实的例子来说明你遇到的情况,指针会有所帮助吗?
  • Pointers in JavaScript?的可能重复

标签: javascript pointers


【解决方案1】:

不,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

【讨论】:

  • 什么是引用的副本,它可以像指针一样使用吗?如何使用?
  • Reference是对象的名字,copy基本上是指向同一个地址的新名字
  • @user2297366 它只是一个占位符,表示对象的内容,而不是对对象本身的引用。
  • 哦。我现在明白了。非常感谢。
  • “引用的副本”占用多少内存?它基本上只是一个找到实际对象的地址,还是在内存中分配另一个空间来将对象复制到?
【解决方案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不同,你看不到指针的实际地址,也看不到指针的实际值,你只能解引用它(获取它指向的地址的值。)

【讨论】:

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

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

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

var myTarget;

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 您只需返回car 的属性。它与指针或模仿无关,被称为scope
      • 从技术上讲,JS 只是 指针。但是,您只能取消引用它们而不能操纵指针本身。
      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      相关资源
      最近更新 更多