Skip to content

JavaScript vs. Go Expression

xushiwei edited this page Apr 5, 2026 · 1 revision

1. 字面量表达式

类型 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}

2. 算术表达式

运算 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 中是表达式,可以嵌套使用。


3. 比较表达式

运算 JavaScript Go
等于 ==(宽松,会隐式转换)/ ===(严格) ==(严格,类型必须一致)
不等于 != / !== !=
大于 / 小于 > / < > / <
大于等于 / 小于等于 >= / <= >= / <=
比较对象/结构体 引用比较(=== 比地址) 值比较(所有字段可比较时用 ==
比较数组/切片 === 比引用,内容比较需手动 切片不可直接 ==,需用 reflect.DeepEqual 或逐元素比较

4. 逻辑表达式

运算 JavaScript Go
&& &&
|| ||
! !
短路求值 支持,且返回操作数的值(非布尔) 支持,但必须返回 bool 类型
空值合并 a ?? bnull/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 = "匿名"
}

5. 位运算表达式

运算 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

6. 赋值表达式

运算 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

7. 条件(三元)表达式

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
}

8. 函数调用表达式

特性 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...)

9. 类型相关表达式

特性 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)

10. 其他特殊表达式

特性 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(接收)

Clone this wiki locally