谁能用JavaScript语言向我解释什么是"指针"?

ale*_*nco 1 javascript pointers go

我是一名学习Go的JavaScript编码员.我正在学习本教程:http://tour.golang.org/#52

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())
}
Run Code Online (Sandbox Code Playgroud)

我在维基百科和Go文档中读到了什么指针,但我仍然可以理解它们.任何人都可以用JavaScript语言向我解释它们吗?

Ain*_*r-G 6

它们有点类似于JS和其他语言中的对象引用,但并不完全相同.指针比引用更强大(因此更危险).考虑以下JS代码.

var a = {foo: true};
var b = a;
a.foo = false;
console.log(b); // Output: "Object { foo: false }"
Run Code Online (Sandbox Code Playgroud)

两者a和b这里都像指针.当你这样做时,b = a你不克隆一个对象,你b可以引用(或指向你)与同一个对象a.在Go中你可以做到两件事:

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}"
Run Code Online (Sandbox Code Playgroud)

操场

重要的区别是在JS中你实际上不能替换函数内的对象.

var a = {foo: true};
(function(x) { x = {foo: false} })(a);
console.log(a); // Output: "Object { foo: true }"
Run Code Online (Sandbox Code Playgroud)

在Go你可以做得很好:

pa := &T{Foo: true}
func(p *T) { *p = T{Foo: false} }(pa)
fmt.Println(pa) // Output: &{false}
Run Code Online (Sandbox Code Playgroud)

操场

另一个区别是你可以指向不仅仅是结构,而是任何类型,包括指针.

  • @alexchenco了解C会有所帮助,但并不是必需的.指针是一开始看起来很难的东西之一,但是一旦你看到它们只是内存地址,你就会开始怀疑,为什么你认为这很难. (2认同)