我之前使用过 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