005不同语言的空安全概念

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨枫阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值