我以前使用过 C++,我意识到指针非常有用。javascript中有什么东西可以像指针一样起作用吗?javascript有指针吗?当我想使用类似的东西时,我喜欢使用指针:
var a = 1;
var b = "a";
document.getElementById(/* value pointed by b */).innerHTML="Pointers";
我知道这是一个非常简单的示例,我可以只使用a
,但是还有几个更复杂的示例,我会发现指针非常有用。有任何想法吗?
我以前使用过 C++,我意识到指针非常有用。javascript中有什么东西可以像指针一样起作用吗?javascript有指针吗?当我想使用类似的东西时,我喜欢使用指针:
var a = 1;
var b = "a";
document.getElementById(/* value pointed by b */).innerHTML="Pointers";
我知道这是一个非常简单的示例,我可以只使用a
,但是还有几个更复杂的示例,我会发现指针非常有用。有任何想法吗?
不,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
你敢打赌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 不同,您看不到指针的实际地址,也看不到指针的实际值,您只能取消引用它(获取它指向的地址处的值。)
我刚刚做了一件奇怪的事情,也成功了。
与其传递指针,不如传递一个将其参数填充到目标变量中的函数。
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