提问人:Dylan Vander Berg 提问时间:6/30/2013 最后编辑:Dylan Vander Berg 更新时间:11/13/2023 访问量:133509
javascript 中有指针吗?
Are there pointers in javascript?
问:
我以前使用过 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 不同,您看不到指针的实际地址,也看不到指针的实际值,您只能取消引用它(获取它指向的地址处的值)。
评论
从技术上讲,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
评论
car
scope
由于 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})
我刚刚做了一件奇怪的事情,也成功了。
不要传递指针,而是将填充其参数的函数传递到目标变量中。
var myTarget;
class dial{
constructor(target){
this.target = target;
this.target(99);
}
}
var myDial = new dial((v)=>{myTarget = v;});
这可能看起来有点邪恶,但效果很好。在这个例子中,我创建了一个通用的刻度盘,可以用这个小函数“(v)=>{target = v}”的形式为它分配任何目标。不知道它在性能方面会有多好,但它表现得很漂亮。
按引用和数组分配。
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>
然后指针.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
评论
swap
[a, b] = [b, a];
a
b