HarmonyOS鸿蒙Next中ArkTS中函数后跟着!和!!

HarmonyOS鸿蒙Next中ArkTS中函数后跟着!和!! 就比如一个函数的屁股后面跟着一个getInfomation()!和getInfomation()!!在实际代码中有什么区别吗?

7 回复

没有区别,!跟在方法或者变量后面是非空断言操作符,在ArkTS中!!!没有区别,并且!并不会影响方法的正常调用,即使方法的返回值是NULL,如下demo也可以正常执行:

let flag = fun1()!
let flag1 = fun1()!!

function fun1(): Boolean|null{
  console.log('==============')
  return null;
}

更多关于HarmonyOS鸿蒙Next中ArkTS中函数后跟着!和!!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


getInfomation()! 和 getInfomation()!! 的区别主要与 空安全机制 和 断言操作 相关

单感叹号 !

用作非空断言操作符(Non-null Assertion Operator),强制告诉编译器该表达式结果不为 null/undefined,若实际结果为 null,运行时会导致崩溃

双感叹号 !!

是两次逻辑非运算的组合,用于将任意值强制转换为布尔类型。

!和!!是两种不同的类型断言操作符,核心区别是对可空类型(Nullable Types)的处理方式:

单感叹号!(非空断言),用于明确告知编译器该表达式结果不为null或undefined。主要用于确认值必然存在但类型系统无法自动推导的场景。比如:

let str: string | null = getInformation()!; // 断言结果不为空

console.log(str.length); // 不需要空安全检查

双感叹号!!(双重非空断言),第一步将值转为布尔类型(非空值转为true,null/undefined转为false),第二步对布尔值取反,最终效果是将任意类型强制转换为boolean类型,比如:

let flag: boolean = !!getInformation(); // 空值转为false,非空转为true

应用区别对比:

// 我这里假设 getInformation() 返回类型为 string | null

// 场景1:直接访问属性

console.log(getInformation()!.length); // 已知非空时直接使用

console.log(getInformation()?.length); // 安全调用(需处理空值)

// 场景2:逻辑判断

if (!!getInformation()) {

// 等价于判断 getInformation() != null

}
写法 含义 影响层面 结果示例(假设返回 null 时)
getInformation()! 断言返回值非 null/undefined 类型检查(编译时) 运行时仍为 null(可能报错)
getInformation()!! 强制转为布尔值 运行时值 结果为 false

这是什么奇葩写法?正常人会这么写?

在HarmonyOS鸿蒙Next的ArkTS中,函数后跟!!!是类型断言操作符:

  1. !(非空断言):告诉编译器该表达式结果不为nullundefined,即使类型系统无法确定。例如:let len = str!.length

  2. !!(双非断言):将值强制转换为布尔类型。第一个!将值转换为布尔值并取反,第二个!再取反回来。例如:let isTrue = !!value

这两种操作符都用于类型处理,!用于空值断言,!!用于布尔转换。使用时需确保逻辑正确,避免运行时错误。

在HarmonyOS Next的ArkTS中,函数后跟的!!!是类型断言操作符,用于处理可能为null或undefined的值:

  1. getInfomation()! - 单感叹号表示非空断言,告诉编译器该函数返回值一定不为null/undefined。如果实际为null会抛出运行时异常。

  2. getInfomation()!! - 双感叹号是强制非空断言,会立即执行类型转换:

    • 如果值为null/undefined,会直接抛出TypeError
    • 否则返回对应的非空类型值

主要区别:

  • !只是编译时断言,不改变运行时行为
  • !!会主动执行运行时检查并转换类型
  • 使用!!!更严格,能更早发现潜在的空值错误

建议在明确知道值不为空时用!,需要强制确保非空时用!!。两者都要谨慎使用,过度使用可能掩盖潜在的空值问题。

回到顶部