1. fallthrough关键字
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
func main() {
i := 10
switch i {
case 1:
fmt.Println(1)
case 5:
fmt.Println(5)
fallthrough
case 10:
fmt.Println(10)
fallthrough
case 20:
fmt.Println(20)
default:
fmt.Println("default")
}
}
运行结果:
10
20
2. 简式变量声明仅能在函数内部使用
// 第一种
var i int
i = 10
// 第二种 (简式变量声明)
i := 10
3. || vs ??
||
和??
(ES2020 引入)都是指定默认值
读取对象属性的时候,如果某个属性的值是null
或undefined
,有时候需要为它们指定默认值。常见做法是通过||
和??
运算符指定默认值
const firstName = message?.body?.user?.firstName || 'default';
||
和??
的区别在于:
使用||
:属性的值如果是null
或undefined
,或者为空字符串或false
或0
,默认值都会生效
使用??
:属性的值只有是null
或undefined
,默认值才会生效
?. 说明
ES2020 引入的“链判断运算符”
适用场景:读取对象内部的某个属性,需要判断属性的上层对象是否存在
上面代码使用了?.
运算符,直接在链式调用的时候判断,左侧的对象是否为null
或undefined
。如果是的,就不再往下运算,而是返回undefined
。
等价实例:
a?.b
// 等同于
a == null ? undefined : a.b
a?.[x]
// 等同于
a == null ? undefined : a[x]
a?.b()
// 等同于
a == null ? undefined : a.b()
a?.()
// 等同于
a == null ? undefined : a()
注:如果a?.b()
里面的a.b
有值,但不是函数,不可调用,那么a?.b()
是会报错的。a?.()
也是如此,如果a
不是null
或undefined
,但也不是函数,那么a?.()
会报错。