我以前使用过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
var a = {}; var b = { c:a };
中,可以安全地说 b.c
不持有 a
的副本,而是持有一个代表 a
在内存中位置的值。在这种情况下,会在内存中分配三个空间:一个类型为 Object 的 a
,一个类型为 Object 的 b
,以及一个类型为 Int 的 b.c
,它保存着 a
在内存中的位置值。 - Frank当然有指针在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}”指定任何目标。不知道它在性能方面表现如何,但它的操作非常流畅。
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]];
}
}
对于用户3015682提供的示例,您可以按如下方式使用此函数:
Original Answer翻译成:“最初的回答”
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>
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);
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
car
的属性。这与指针或模拟无关,被称为“作用域”。 - Dimitri L.
a
和b
是引用的话,这是正确的 :) 我的意思是你不能在另一个函数中交换原始类型的值(比如数字),但是在C语言中你可以很容易地通过指针来实现。 - undefined[a, b] = [b, a]
来代替swap(a, b)
。(不过,行为不取决于a
和b
的内容。) - undefined[a, b] = [b, a]
。我的意思是我不能在某个函数swap
中写这个。例如,在 C 中,添加关于交换两个变量值的额外日志是没有成本的,但在 JS 中,每次交换两个变量的值时,我都必须在每个地方写这个额外的日志。 - undefined