作者:红目香薰
团队:坚果派

社区地址:坚果派社区

坚果派由坚果等人联合创建,团队拥有12个华为HDE,以及若干其他领域的三十余位万粉博主运营。 专注于研究的技术包括OpenHarmony,ArkUI-X,元服务,鸿蒙原生应用、仓颉,AI、BlueOS操作系统等。已上架鸿蒙原生应用18款,三方库72个。 主营业务是面向国内外客户提供新一代信息技术为核心的产品、解决方案和服务。团队聚焦“鸿蒙原生应用”、“智能物联”和“AI赋能”、“人工智能”四大业务领域,依托华为开发者专家等强大的技术团队,以及涵盖需求、开发、测试、运维于一体的综合服务体系,赋能文旅、媒体、社交、家居、消费电子等行业客户,满足客户数字化升级转型的需求,帮助客户实现价值提升。

目录

前言

问题还原演示:

问题原理具体说明:

问题总结:


前言

最开始我以为是非常离奇的问题,我没有理解,但是我找出解决方案了,后来想明白了逻辑。

希望能帮助到鸿蒙的小伙伴们。

找问题的过程中我快崩溃了,虽然对ArkTS入门的时间不是很长,但是起码我有10年开发经验了,其它后端语言都正常使用的,长度这是6,算法中1000或甚至10000该怎么办我现在没啥方案,当时几十个的时候我们还是能用这种方法解决的,否则就得有一个单独的函数来挨个赋值一遍。

找到原因后就明白了,我们先看问题,再说什么原因。

问题还原演示:

// 失败
public static arr1: Array<number> = new Array<number>(6);
// 成功
public static arr: Array<number> = [0, 0, 0, 0, 0, 0];

首先看成功数据统计效果:

接下来看失败的:

失败的就很莫名其妙,数组初始值都是0,不单独赋值就不能正常计算,存储的时候不可能数值类型为null吧。

问题原理具体说明:

很明显,在使用new来声明数组的时候再累加操作时出现的结果是NaN,说明在计算中出现了非数值类型出现,但是我这里使用了Number()来转换格式了,这就在此说明默认值属于前端常见的类型了【undefined】了,我在用js的时候经常遇到它,但是我以为ArkTS应该属于半个后端,所以就没往这方面想,现在想想,是我后端思维的问题了。

ArkTS语言相当于TypeScript,在 TypeScript 中,使用 new Array<number>(6) 创建的数组会初始化一个长度为 6 的数组,但数组中的每一项默认值是 undefined。这会导致在进行累加运算时出现 NaN,因为 undefined 与任何数字相加都会得到 NaN。

我们可以用两种方法来解决:

public static arr: Array<number> = [0, 0, 0, 0, 0, 0];

public static arr: Array<number> = new Array<number>(6).fill(0);

问题总结:

问题还原演示中,成功数据统计效果正常,而失败的情况却十分诡异。数组初始值为 0,若不单独赋值便无法正常计算,存储时数值类型也不可能为 null。问题原理在于,使用 new 声明数组并进行累加操作时,结果出现 NaN,这表明计算中出现了非数值类型。虽使用了 Number () 转换格式,但由于 ArkTS 类似于 TypeScript,使用 new Array(6) 创建长度为 6 的数组时,每一项默认值是 undefined,undefined 与任何数字相加都会得到 NaN。
针对这个问题,我找到了两种解决方法。此次经历让我意识到是自己的后端思维惯性导致了问题的出现,希望我的经验能帮助到同样在鸿蒙开发中使用 ArkTS 的小伙伴们。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐