javascript中有指针吗?

问题描述 投票:0回答:7

我以前使用过C++,我意识到指针非常有帮助。 javascript 中有没有类似指针的东西? JavaScript有指针吗?当我想使用类似的东西时,我喜欢使用指针:

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

我知道这是一个非常简单的示例,我可以只使用

a
,但是有几个更复杂的示例,我会发现指针非常有用。有什么想法吗?

javascript pointers
7个回答
124
投票

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

63
投票

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


5
投票

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

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

var myTarget;

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

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


3
投票

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

0
投票

通过引用和数组进行赋值。

let pizza = [4,4,4];
let kebab = pizza;  // both variables are references to shared value
kebab.push(4);
console.log(kebab); //[4,4,4,4]
console.log(pizza); //[4,4,4,4]

由于原始值未修改,因此不会创建新的引用。

kebab = [6,6,6,6];  // value is reassigned
console.log(kebab); //[6,6,6,6]
console.log(pizza); //[4,4,4,4]

当变量中的复合值被重新分配时,就会创建一个新的引用。


0
投票

是的,事实上,所有的对象和数组都是指针。 如果我必须从字面上看你的例子,那么,你只需要把变量变成对象类型,例如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pointers</title>
</head>
<body>
    <h1>Asynchronous JavaScript</h1>

<!--the pointer with class b--->
    <p>Our City</p>
    <p id="variableA" >Minnesota</p>

    <script src="pointers.js" ></script>
</body>
</html>

然后是pointers.js

var a = {name: "todos", data: {pointerOne: 'Minnesota', pointerTwo: 'NewYork'}};
var b = a;//pointer to a

setTimeout(()=>{
//using timeout to see our pointer at work!

b.data.pointerOne = 'Nairobi';
document.getElementById('variableA').innerHTML = a.data.pointerOne;

}, 3000);

JavaScript 中的主要区别在于指针实际呈现的方式或缺乏识别指针的直接方法。在 C、Golang 和 C# 中,指针是使用“&”运算符创建的。

这是基本的。得到这个概念后,你现在可以将它进一步发展为函数指针、链表,或者像结构体一样使用它;并以 C++ 方式执行 JavaScript。 不过我建议您使用当前的 JavaScript 约定来命名变量。 即

const a = {name: "todos", data: {pointerOne: 'Minnesota', pointerTwo: 'NewYork'}};
const b = a;//pointer to a

-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
© www.soinside.com 2019 - 2024. All rights reserved.