(1)编译时检查(静态空安全):代表语言: TypeScript, Swift, Kotlin, Dart
下面这几门语言都有共同点:
(1)可空性: 类型系统严格区分可空和非空。string: 表示一个非空字符串,string | null或者string?表示一个可以为空的字符串,二者不可相互赋值
(2)类型缩小,通过if等条件判断之后,编译器知道是否是空
(3)非空断言
ts
可空性
-
string: 表示一个非空字符串。 -
string | null: 表示可以是字符串也可以是null。 -
string | undefined: 表示可以是字符串也可以是undefined。 -
string | null | undefined: 三者皆有可能。
类型缩小:
function greet(name: string | null) {
if (name === null) {
console.log(‘Hello, guest!’);
} else {
// 在这个分支里,编译器知道 name 是 string 类型,可以安全使用
console.log(`Hello, ${name.toUpperCase()}!`);
}
}
非空断言
const maybeName: string | null = getName();
const length = maybeName!.length; // 危险!如果 maybeName 为 null,运行时就会崩溃。
swift
可空性
-
String: 一个必须存在的字符串。 -
String?: 一个可选的字符串,可能为nil。
类型缩小
if let name = optionalName {
// name 在这里是非空的 String 类型
print("Hello, \(name)")
}
强制解包/非空断言
let name = optionalName! // 危险!
kotlin
可空性
-
String: 一个必须存在的字符串。 -
String?: 一个可选的字符串,可能为nil。
类型缩小
fun greet(name: String?) {
if (name == null) {
println("Hello, guest!")
} else {
// 在这里,编译器知道 name 是 String 类型(非空)
println("Hello, ${name.uppercase()}!") // 可以直接调用方法
}
}
强制解包/非空断言
val name = inputName!! // 如果为 null,抛出 KotlinNullPointerException
dart
可空性
-
String: 一个必须存在的字符串。 -
String?: 一个可选的字符串,可能为nil。
类型缩小
void greet(String? name) {
if (name == null) return;
// 编译器知道执行到这里时,name 肯定不为 null
print('Hello, ${name.toUpperCase()}');
}
强制解包/非空断言
String? nullableName = 'Alice';
// 强制解包:告诉编译器"我确定这个值不为null"
String name = nullableName!;
(2)运行时检查(动态空安全):语言本身不区分可空和非空类型,如果对象为 null,会抛出一个明确的运行时异常,代表语言: Python (部分),JavaScript (部分,通过语法糖)。
js
特点:js无静态空安全,任何变量都可以是null undefined
应对机制:
-
条件判断: 使用
if (obj != null)或if (obj !== undefined && obj !== null)进行防御性编程。 -
三目运算
-
可选链(Optional Chaining, ES2020):
// 如果 user 或 user.address 为 null/undefined,则返回 undefined,而不会报错。
const city = user?.address?.city;
-
空值合并(Nullish Coalescing, ES2020):
// 只有当左侧是 null 或 undefined 时,才返回右侧的默认值。
const name = inputName ?? 'Anonymous';
python
条件判断: 使用 if variable is None
三目运算符判断:
x = 10 if condition else 20
总结:其实js和python差不多,都是靠条件判断来避免空值,只是语法差异
(3)差异点
强制解包:只有kotlin是!! 其他语言!
可选链支持:user?.address?.city; 支持语言,js/ts/kotlin/swift/Dart,只有python不支持
空值合并和三目运算:支持语言 js/ts/swift/Dart ,python和kotlin有差异,kotlin是
//kotlin
val name = inputName ?: "Anonymous" 代替空值合并
//kotlin
val result = if (condition) "A" else "B"
//python
x = 10 if condition else 20

被折叠的 条评论
为什么被折叠?



