forked from goplus/xgo
-
Notifications
You must be signed in to change notification settings - Fork 4
JavaScript vs. Go Expression
xushiwei edited this page Apr 5, 2026
·
1 revision
| 类型 | JavaScript | Go |
|---|---|---|
| 整数 | 42 |
42 |
| 浮点数 | 3.14 |
3.14 |
| 字符串 |
"hello" / 'hello' / `hello`
|
"hello" |
| 原始字符串 |
`hello\nworld`(模板字符串,\n 不转义需用 \\n) |
`hello\nworld`(反引号,\n 不转义) |
| 布尔 |
true / false
|
true / false
|
| 空值 |
null / undefined
|
nil |
| 数组 | [1, 2, 3] |
[]int{1, 2, 3} |
| 对象/结构体 | { name: "Tom", age: 18 } |
Person{Name: "Tom", Age: 18} |
| Map |
new Map() / {}
|
map[string]int{"a": 1} |
| 运算 | JavaScript | Go |
|---|---|---|
| 加 | a + b |
a + b |
| 减 | a - b |
a - b |
| 乘 | a * b |
a * b |
| 除 |
a / b(结果可为浮点) |
a / b(整数除法截断) |
| 取余 | a % b |
a % b |
| 幂 | a ** b |
无运算符,用 math.Pow(a, b)
|
| 自增 |
a++ / ++a
|
a++(仅后置,且是语句非表达式) |
| 自减 |
a-- / --a
|
a--(仅后置,且是语句非表达式) |
⚠️ Go 中a++是语句,不能写成b = a++;JS 中是表达式,可以嵌套使用。
| 运算 | JavaScript | Go |
|---|---|---|
| 等于 |
==(宽松,会隐式转换)/ ===(严格) |
==(严格,类型必须一致) |
| 不等于 |
!= / !==
|
!= |
| 大于 / 小于 |
> / <
|
> / <
|
| 大于等于 / 小于等于 |
>= / <=
|
>= / <=
|
| 比较对象/结构体 | 引用比较(=== 比地址) |
值比较(所有字段可比较时用 ==) |
| 比较数组/切片 |
=== 比引用,内容比较需手动 |
切片不可直接 ==,需用 reflect.DeepEqual 或逐元素比较 |
| 运算 | JavaScript | Go |
|---|---|---|
| 与 | && |
&& |
| 或 | || |
|| |
| 非 | ! |
! |
| 短路求值 | 支持,且返回操作数的值(非布尔) | 支持,但必须返回 bool 类型 |
| 空值合并 |
a ?? b(null/undefined 时取 b) |
无,需用 if 判断 |
| 可选链 | a?.b?.c |
无,需手动判空 |
// JS:|| 返回操作数本身
const name = user.name || "匿名"; // user.name 为假值时取 "匿名"
const val = a ?? b; // 仅 null/undefined 时取 b// Go:必须显式判断
name := user.Name
if name == "" {
name = "匿名"
}| 运算 | JavaScript | Go |
|---|---|---|
| 按位与 | a & b |
a & b |
| 按位或 | a | b |
a | b |
| 按位异或 | a ^ b |
a ^ b |
| 按位非 | ~a |
^a(一元) |
| 左移 | a << b |
a << b |
| 右移(有符号) | a >> b |
a >> b |
| 右移(无符号) | a >>> b |
无(Go 无符号类型右移本身无符号扩展) |
| 位清除(AND NOT) | 无 | a &^ b |
| 运算 | JavaScript | Go |
|---|---|---|
| 基本赋值 | a = b |
a = b |
| 短变量声明 |
let a = b / const a = b
|
a := b |
| 复合赋值 |
+= -= *= /= %= **= &= |= ^= <<= >>= >>>=
|
+= -= *= /= %= &= |= ^= <<= >>= &^=
|
| 解构赋值 |
const [a, b] = arr / const {x, y} = obj
|
多返回值:a, b := func()
|
| 交换变量 | [a, b] = [b, a] |
a, b = b, a |
| JavaScript | Go | |
|---|---|---|
| 语法 | condition ? exprA : exprB |
不支持,必须用 if-else
|
// JS
const max = a > b ? a : b;// Go:必须用 if-else 语句
var max int
if a > b {
max = a
} else {
max = b
}| 特性 | JavaScript | Go |
|---|---|---|
| 普通调用 | fn(a, b) |
fn(a, b) |
| 方法调用 | obj.method(a) |
obj.Method(a) |
| 多返回值 | 不支持(用数组/对象模拟) | 原生支持:val, err := fn()
|
| 立即调用函数 |
(function(){ ... })() / (() => { ... })()
|
无专用语法,用匿名函数:func(){ ... }()
|
| 可变参数 |
fn(...args) / function fn(...args){}
|
fn(args...) / func fn(args ...T)
|
| 展开参数 | fn(...arr) |
fn(slice...) |
| 特性 | JavaScript | Go |
|---|---|---|
| 类型判断 |
typeof x / x instanceof T
|
x.(type)(类型选择) |
| 类型断言 | 无(TS 有 x as T) |
x.(T),失败时 panic;安全形式:v, ok := x.(T)
|
| 类型转换 | 隐式或 Number(x) / String(x) 等 |
显式:int(x) / float64(x) / string(x)
|
| 特性 | JavaScript | Go |
|---|---|---|
| 模板字符串 | `Hello, ${name}!` |
无,用 fmt.Sprintf("Hello, %s!", name)
|
in 运算符 |
"key" in obj → 判断属性是否存在 |
无,用 _, ok := m[key]
|
typeof |
typeof x → 返回类型字符串 |
无直接对应,用类型断言或反射 |
| 逗号表达式 |
(a = 1, b = 2, a + b) → 返回最后一个值 |
不支持 |
void 运算符 |
void expr → 返回 undefined
|
不支持 |
| 地址/解引用 | 无 |
&x(取地址)、*p(解引用) |
| channel 收发 | 无 |
ch <- v(发送)、v := <-ch(接收) |