我以前使用过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})
通过引用和数组进行赋值。
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]
当变量中的复合值被重新分配时,就会创建一个新的引用。
是的,事实上,所有的对象和数组都是指针。 如果我必须从字面上看你的例子,那么,你只需要把变量变成对象类型,例如
<!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
从技术上讲,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