【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利 - 详解

news/2025/9/28 8:19:52/文章来源:https://www.cnblogs.com/tlnshuju/p/19116026

【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利 - 详解

2025-09-28 08:16  tlnshuju  阅读(0)  评论(0)    收藏  举报

在客户端开发中,你是否曾遇到过这样的困扰:一次看似寻常的网络数据解析,却导致了出人意料的崩溃;一个本该正常的文件读取操作,却返回了难以理解的数据错误。这些问题的根源,往往指向同一环节——数据类型转换。当应用面对网络传输、文件I/O等不可控的数据源时,如何稳健、准确地进行数据解析与转换,就成为保障应用稳定性的第一道防线。

本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书第四章内容的延续,是咱这本书读者的福利,在本篇内容中以模拟多种数据输入,向基础数据类型转换的输出,以确定最优的代码编方式,以避免非预期的异常产生,每个示例可以独立的编译及调试,欢迎大家一同来深入的解,甚至可以当作面试题来学习。

打个广告,对本书感兴趣的同学可以点击以下链接进行购买,或者了解我的班级参加 班级共同学习,点击链接可进入(华为官方活动)

  • 机械工业出版社官方京东旗舰店
  • 机械工业出版社京东自营旗舰店
  • 机械工业出版社官方当当旗舰店

往期福利:

  1. 【页面路由导航】三步实现页面跳转的完整示例-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  2. 【鸿蒙生态共建】一文10个示例讲懂鸿蒙系统ArkTS中的null与undefined的区别与应用-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  3. 【鸿蒙生态共建】一文两表三实例讲清async函数与普通函数的区别-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

1: 基础测试数据准备

在ArkTS中,由于语言的特性,无法直接对 null 及 undefined 进行直接强转,故先将该数据存到Record中,之后再使用,由于在Record类型数据中指定的key没有value时会返回undefined,故在示例中没有添加该value为undefined的数据项。

// 声明一个变量testRecord,其中包含字串、数字和null数据,可以通过testRecord获取对应的不同类型数据
const testRecord:Record= {"null_key":null,"str_key":"1xxx","num_key":"666"}

2: 不同类型数据转string

下面的示例中,分别将null、undefined、通过Strinrg(...) 和 ... as string进行向字符串转换。

const String_null = String(null)
// String(null) null
console.log("俩毛豆 String(null) " + String_null)const String_undefined = String(undefined)
// String(undefined) undefined
console.log("俩毛豆 String(undefined) " + String_undefined)const testRecord_null = testRecord["null_key"];
const nullAsString = testRecord_null as String;
// nullValueAsString null
console.log("俩毛豆 nullValueAsString " + nullAsString)const testRecord_nokey = testRecord["nokey"];
const noKeyValueAsString = testRecord_nokey as String;// noKeyValueAsString undefined
console.log("俩毛豆 noKeyValueAsString " + noKeyValueAsString)

对应的log输出及编译调试时的变量状态的截图,因为log输出是没有双引号的,需要注意一下实际的变量值,可以看出,String(...)操作在强转时会把null和undefined强转为"null"和"undefined"。而... as string的操作对于null和undefined强转之后的结果依然是null和undefined。这时如果判断字符串是否有效,使用的方式就有所不同了。或者应该先对该原值进行有效性判断之后,再进行字符串的转换。

Log 输出

调试态,可看变量值

3: 不同类型转number

下面的示例中,分别将null、undefined及非纯字符的字串、通过Number(...) 和 ... as number进行转换。

const Number_null = Number(null)
// Number(null) 0
console.log("俩毛豆 Number(null) " + Number_null)
const Number_undefined = Number(undefined)
// Number(undefined) NaN
console.log("俩毛豆 Number(undefined) " + Number_undefined)const nullAsNumber = testRecord_null as number;
// nullAsNumber null
console.log("俩毛豆 nullAsNumber " + nullAsNumber)
const noKeyValueAsNumber = testRecord_nokey as number;
// noKeyValueAsNumber undefined
console.log("俩毛豆 noKeyValueAsNumber " + noKeyValueAsNumber)// 特定场景,非数字字串转数字
const Number_str = Number("1xxx");
// Number_str NaN
console.log("俩毛豆 Number_str " + Number_str)
const strValueAsNumber = testRecord["str_key"]  as number;
// strValueAsNumber 1xxx
console.log("俩毛豆 strValueAsNumber " + strValueAsNumber)
// Number_str type number
console.log("俩毛豆 Number_str type " + typeof Number_str)

对应的log输出及编译调试时的变量状态的截图,可以看出,Number(...)操作在强转时会把null和undefined强转为0和NaN。而... as number的操作对于null和undefined强转之后的结果依然是null和undefined。当输入的数据为非纯数字的字符串时,Number(...)操作在强转时会把非纯数字的字符串强转为NaN,而... as number的操作对于非纯数字的字符串强转之后的结果依然是原字串。这时如果判断数字是否有效,使用的方式也是需要分别对待。个人建议应该先对该原值进行有效性判断之后,再进行数值的转换,再进行一次数值的有效性判断。注意,NaN的类型是number

Log输出

调试态,可看变量值

4: NaN类型的判断

在前面的内容中有部分内容转换为NaN,关于null及undefined的判断方式是较基础的知识,在这里就不作过多的介绍,NaN的判断有些特殊,下面的代码分别使用多种判断方式,进行对比。

// Number_str == Number.NaN false
if (Number.NaN == Number.NaN) {console.log("俩毛豆 Number.NaN == Number.NaN true");
} else {console.log("俩毛豆 Number.NaN == Number.NaN false");
}// Number.NaN !== Number.NaN true
if (Number.NaN !== Number.NaN) {console.log("俩毛豆 Number.NaN !== Number.NaN true");
} else {console.log("俩毛豆 Number.NaN !== Number.NaN false");
}
// Number.NaN != Number.NaN true
if (Number.NaN != Number.NaN) {console.log("俩毛豆 Number.NaN != Number.NaN true");
} else {console.log("俩毛豆 Number.NaN != Number.NaN false");
}// Number.isNaN(num) true
if (Number.isNaN(Number_str)) {console.log("俩毛豆 Number.isNaN(num) true");
} else {console.log("俩毛豆 Number.isNaN(num) false");
}

对应的log输出的截图,在ArkTS中,Number.NaN是Number类型的一个特殊值。它被用来表示非数值,这里的数值是指在IEEE浮点数算术标准中定义的双精度64位格式的值。在ArkTS中,Number.NaN的独特之处在于它不等于任何值,包括其本身。与Number.NaN进行比较时,结果是令人困惑的:Number.NaN !== Number.NaN 和 Number.NaN != Number.NaN 的值都是 true。因此,必须使用Number.isNaN()函数来测试一个值是否是Number.NaN。

总结: 

在本篇的内容中,介绍了非预期(异常)数据转string和number的情况,目标是了解不同数据在转换时的实际结果,在客户端编码时提前作好预防,避免因外因导致的异常产生。

下图为转换之前的数据项及转换之后的数据项的实际内存值,可以看出Number(...)及String(..)的转换处理逻辑要强一些(会改变原始类型和值),而 ...as number及...as string的转换的处理逻辑要弱一些(不会改变原始类型及值),在实际研发过程中,需要进行必要的有效性验证,以保证应用运行的稳定性,特别是外部输入的数据,有效性验证是必需要作的工作。

最后再打下广告,对本书感兴趣的同学可以点击以下链接进行购买,或者了解我的班级参加 班级共同学习,点击链接可进入(华为官方活动)

  • 机械工业出版社官方京东旗舰店
  • 机械工业出版社京东自营旗舰店
  • 机械工业出版社官方当当旗舰店

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一级a做爰片免费网站体验区网站制造

2014年杭州电子科技大学Java期末试卷.doc杭州电子科技大学学生考试卷( A )卷考试课程Java语言程序设计考试日期2014年 6月 16日成 绩课程号教师号任课教师姓名考生姓名学号(8位)年级专业注意:所有答案均写在答卷上,写在试卷上无效;(一)单选题(每题2分&am…

青岛商城网站建设劳务公司注册需要什么条件

CMA实验室认可,即中国计量认证(China Metrology Accreditation)的实验室资质认定,以下是对其的详细解读: 一、定义与目的 CMA认证是经省级以上人民政府计量行政部门对实验室的计量检定、测试能力和可靠性考核合格后进…

网站建设资质要求贝壳找房官网 二手房

文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例1 1 函数原型 strcat():将src指向的字符串拼接在dest指向的字符串末尾,函数原型如下: char *strcat(char *dest, const char *src);2 参数 strcat()函数有两个参数src和dest&am…

网站建设需要条件查询网域名解析

共享数据缓冲区 概述共享数据缓冲区管理共享缓冲区管理的核心功能包括:共享数据缓冲区的组织结构初始化共享缓冲池BufferDesc 结构体InitBufferPool 函数如何确定请求的数据页面是否在缓冲区中?BufferTag 结构体RelFileNode 结构体ForkNumber 结构体ReadBuffer_common 函数怎…

Splunk Enterprise 10.0.1 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台

Splunk Enterprise 10.0.1 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台Splunk Enterprise 10.0.1 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台 Search, analysis, and visu…

基于51单片机宠物喂食系统设计 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

福建建设工程设计备案网站怎么推广公众号让人关注

1.hash类型介绍 可以理解为redis中的一个小型redis 2.v 3.hash数据类型的扩展操作 4.hash类型数据操作的注意事项

[Luogu 13345] EGOI 2025:IMO

先根据排序方案确定最终顺序。下文称第 \(i\) 个人为最终排名为 \(i\) 的那个人,其原始编号为 \(id_i\),总成绩为 \(v_i\)。 若第 \(i\) 个人公布了 \(c_i\) 道题,公布部分成绩为 \(s_i\),则可能成绩区间为 \([s_i…

广州金融网站设计wordpress 淘宝客主题

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 time.sleep(3) 固定等待3秒 driver.implicitly_wait(10) 隐性的等待,对应全局 WebD…

详细介绍:flutter 编译报错java.util.zip.ZipException: zip END header not found

详细介绍:flutter 编译报错java.util.zip.ZipException: zip END header not foundpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

Linux高级技巧之集群部署(七) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别

实用指南:python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别2025-09-28 08:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important…

设计感强的网站同一网站能否同时运行php和asp

原文:C#设计模式(19)——状态者模式(State Pattern)一、引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态…

什么是门户网站?民治营销网站

学习面向对象好几年了,但一直没有深刻的理解面向对象,直到最近开始做自动化测试平台开发过程中,才发现面向对象的魅力。因而决定好好把设计模式学习下。首先先了解下设计模式相关的定义以及主意事项: 1.  什么是设计模式&#x…

游戏网站开发难度免费好用wordpress主题

如何在学校里讲创新, 这是一个老问题。 但是天朝的教育体制总有办法,请看: http://news.163.com/10/1125/03/6MABIS4H00014AED.html 武汉一高校设"创新学分" 不搞创新不能毕业 去年秋季,武汉科技大学中南分校出台《学籍管理规定》,…

违法人员都是怎么建设网站的爱趣网

一 流量控制 说明: 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…

泰州企业网站模板建站苍山县建设银行网站

1.树的表示 typedef int DadaType; struct Node{struct Node* firstChild;struct Node* pnextBrotherDataType data; };//树的表示 2.二叉树的简介 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树具有以下特…

千锋教育培训多少钱费用徐州网站优化推广

题干: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方…

又一通信芯片厂商完成数亿元融资!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087近日,杭州必博半导体有限公司(简称:必博半导体)正式宣布完成数…

做题总结

P3891 [GDOI2014] 采集资源 题目链接 一句话题意:给定初始资源 \(M\) 和目标资源 \(T\),有 \(N\) 种苦工,每种苦工消耗 \(A\) 资源生产,每秒产生 \(B\) 资源.求达到或超过 \(T\) 资源的最短时间. 我们设 \(f_{i,j}\) 为…