JavaScript中有指针吗?

unguejic  于 2023-11-15  发布在  Java
关注(0)|答案(7)|浏览(170)

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

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

字符串
我知道这是一个非常简单的例子,我可以只使用a,但有几个更复杂的例子,我会发现指针非常有用。

vwhgwdsa

vwhgwdsa1#

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

字符串

vd2z7a6w

vd2z7a6w2#

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

fruv7luv

fruv7luv3#

我刚做了一件奇怪的事,也成功了。
传递一个函数,将其参数填充到目标变量中,而不是传递指针。

var myTarget;

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

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

pbpqsu0x

pbpqsu0x4#

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

ulmd4ohb

ulmd4ohb5#

通过引用和数组进行排序。

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]


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

ryoqjall

ryoqjall6#

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

<!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

41zrol4v

41zrol4v7#

从技术上讲,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

字符串

相关问题