任何人都可以用JavaScript语言向我解释什么是“指针”?
我是一位正在学习Go的JavaScript编码人员。我下面这个教程:http://tour.golang.org/#52任何人都可以用JavaScript语言向我解释什么是“指针”?
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}
我在维基百科上,并在围棋文档什么的指针是阅读,但我还是能理解他们。任何人都可以用JavaScript语言向我解释它们吗?
它们有点类似于JS和其他语言中的对象引用,但并不完全。指针比引用更强大(因此更危险)。考虑下面的JS代码。
var a = {foo: true};
var b = a;
a.foo = false;
console.log(b); // Output: "Object { foo: false }"
这两个a
和b
这里就像指针。当你做b = a
你不克隆一个对象,你可以参考b
(或点,如果你愿意)与a
相同的对象。在去你能做到既:
type T struct { Foo bool }
a := T{Foo: true}
b := a
a.Foo = false
fmt.Println(b) // b is a copy, so it didn't change. Prints "{true}".
pa := &T{Foo: true}
pb := pa
pa.Foo = false
fmt.Println(pb) // pb points to the same struct as pa, so it prints "&{false}"
最重要的区别是,在JS你不能真正替代函数内部的对象。
var a = {foo: true};
(function(x) { x = {foo: false} })(a);
console.log(a); // Output: "Object { foo: true }"
在去你能做到这一点就好了:
pa := &T{Foo: true}
func(p *T) { *p = T{Foo: false} }(pa)
fmt.Println(pa) // Output: &{false}
另一个区别是,你可以让指针不只是结构,但任何类型的,包括指针。
感谢这对我来说很清楚。只有一件事,在第一个Go例子中,我仍然在'true false'错过了'''你可能会在某处找到'*'?我在教程中看到了这一点。 – alexchenco 2014-10-18 08:47:49
@alexchenco我不太明白你的意思。在我提供的第一个Go示例中,第一个'Println'应该打印“{true}”,第二个“&{false}”(“&”表示这是一个结构的地址,一个指针,而不是结构本身)。它演示了值和指针之间的区别。 – 2014-10-18 09:14:16
对不起,我想我让我误会了某个地方。你的代码是好的。哎呀,我不知道为什么我觉得Go很困难。也许是因为我从来没有用C编程过。 – alexchenco 2014-10-18 11:25:51
一个老问题,但一个明显的说法是,指针实际上是内存中变量的地址。 当通过指针传递变量时,实际传递的是该变量所在的内存地址。
这将是相当困难的,因为JavaScript没有真正像指针一样。 – 2014-10-18 06:55:05
可能的重复[在javascript中是否有指针?](http://stackoverflow.com/questions/17382427/are-there-pointers-in-javascript) – dizel3d 2014-10-18 07:04:18