HarmonyOS鸿蒙Next中ArkTS中函数后跟着!和!!
HarmonyOS鸿蒙Next中ArkTS中函数后跟着!和!! 就比如一个函数的屁股后面跟着一个getInfomation()!和getInfomation()!!在实际代码中有什么区别吗?
没有区别,!
跟在方法或者变量后面是非空断言操作符,在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
!和!!是两种不同的类型断言操作符,核心区别是对可空类型(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
}
这是什么奇葩写法?正常人会这么写?
在HarmonyOS鸿蒙Next的ArkTS中,函数后跟!
和!!
是类型断言操作符:
-
!
(非空断言):告诉编译器该表达式结果不为null
或undefined
,即使类型系统无法确定。例如:let len = str!.length
。 -
!!
(双非断言):将值强制转换为布尔类型。第一个!
将值转换为布尔值并取反,第二个!
再取反回来。例如:let isTrue = !!value
。
这两种操作符都用于类型处理,!
用于空值断言,!!
用于布尔转换。使用时需确保逻辑正确,避免运行时错误。
在HarmonyOS Next的ArkTS中,函数后跟的!
和!!
是类型断言操作符,用于处理可能为null或undefined的值:
-
getInfomation()!
- 单感叹号表示非空断言,告诉编译器该函数返回值一定不为null/undefined。如果实际为null会抛出运行时异常。 -
getInfomation()!!
- 双感叹号是强制非空断言,会立即执行类型转换:- 如果值为null/undefined,会直接抛出TypeError
- 否则返回对应的非空类型值
主要区别:
!
只是编译时断言,不改变运行时行为!!
会主动执行运行时检查并转换类型- 使用
!!
比!
更严格,能更早发现潜在的空值错误
建议在明确知道值不为空时用!
,需要强制确保非空时用!!
。两者都要谨慎使用,过度使用可能掩盖潜在的空值问题。