文章目录背景方法总览Map / WeakMap / Set / WeakSetDate / RegExp / DataViewArrayBuffer 系列TypedArray 系列Uint8Array、Int32Array 等实际使用示例写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓方法总览Map / WeakMap / Set / WeakSet这四个是 JavaScript/TypeScript 的标准容器类型TypeUtil 分别提供了对应的检测方法// Map 检测this.Btn(isMap(new Map()) → true,#16A085,(){this.addLog(isMap(new Map()) →${TypeUtil.isMap(newMap())});})this.Btn(isMap({}) → false,#16A085,(){constobj:SampleObj{a:0};this.addLog(isMap({}) →${TypeUtil.isMap(obj)});})// WeakMap 检测this.Btn(isWeakMap(new WeakMap()) → true,#1ABC9C,(){this.addLog(isWeakMap(new WeakMap()) →${TypeUtil.isWeakMap(newWeakMap())});})// Set 检测this.Btn(isSet(new Set([1,2])) → true,#2ECC71,(){this.addLog(isSet(new Set([1,2])) →${TypeUtil.isSet(newSet([1,2]))});})// WeakSet 检测this.Btn(isWeakSet(new WeakSet()) → true,#27AE60,(){this.addLog(isWeakSet(new WeakSet()) →${TypeUtil.isWeakSet(newWeakSet())});})运行结果isMap(new Map()) → true isMap({}) → false isWeakMap(new WeakMap()) → true isSet(new Set([1,2])) → true isWeakSet(new WeakSet()) → true实际使用场景接受通用参数的函数需要判断传入的是Map还是普通对象{}functionprocessData(data:Mapstring,number|Recordstring,number){if(TypeUtil.isMap(data)){// 按 Map 处理data.forEach((v,k)console.log(k,v));}else{// 按对象处理Object.entries(data).forEach(([k,v])console.log(k,v));}}Date / RegExp / DataView// Date 检测this.Btn(isDate(new Date()) → true,#F39C12,(){this.addLog(isDate(new Date()) →${TypeUtil.isDate(newDate())});})this.Btn(isDate(2024-01-01) → false,#F39C12,(){this.addLog(isDate(2024-01-01) →${TypeUtil.isDate(2024-01-01)});})// RegExp 检测this.Btn(isRegExp(/abc/g) → true,#E67E22,(){this.addLog(isRegExp(/abc/g) →${TypeUtil.isRegExp(/abc/g)});})// DataView 检测this.Btn(isDataView(new DataView(buf)) → true,#D35400,(){constbufnewArrayBuffer(8);constdvnewDataView(buf);this.addLog(isDataView(new DataView(buf)) →${TypeUtil.isDataView(dv)});})运行结果isDate(new Date()) → true isDate(2024-01-01) → false isRegExp(/abc/g) → true isDataView(new DataView(buf)) → trueisDate(2024-01-01)返回false这个很重要——字符串日期不是 Date 对象不能直接调.getFullYear()等方法。ArrayBuffer 系列// ArrayBuffer 检测this.Btn(isArrayBuffer(new ArrayBuffer(4)) → true,#2C3E50,(){this.addLog(isArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isArrayBuffer(newArrayBuffer(4))});})// AnyArrayBuffer包含 SharedArrayBufferthis.Btn(isAnyArrayBuffer(new ArrayBuffer(4)) → true,#2C3E50,(){this.addLog(isAnyArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isAnyArrayBuffer(newArrayBuffer(4))});})运行结果isArrayBuffer(new ArrayBuffer(4)) → true isAnyArrayBuffer(new ArrayBuffer(4)) → trueisArrayBuffer只检测ArrayBufferisAnyArrayBuffer还包含SharedArrayBuffer共享内存缓冲区。TypedArray 系列Uint8Array、Int32Array 等TypedArray 是一系列类型化数组视图常用于二进制数据处理、网络传输、图像处理等场景// Uint8Array无符号8位常用于字节数组this.Btn(isUint8Array(new Uint8Array()) → true,#34495E,(){this.addLog(isUint8Array(new Uint8Array()) →${TypeUtil.isUint8Array(newUint8Array())});})// Uint16Array无符号16位this.Btn(isUint16Array(new Uint16Array()) → true,#34495E,(){this.addLog(isUint16Array(new Uint16Array()) →${TypeUtil.isUint16Array(newUint16Array())});})// Uint32Array无符号32位this.Btn(isUint32Array(new Uint32Array()) → true,#34495E,(){this.addLog(isUint32Array(new Uint32Array()) →${TypeUtil.isUint32Array(newUint32Array())});})// Int8Array有符号8位this.Btn(isInt8Array(new Int8Array()) → true,#7F8C8D,(){this.addLog(isInt8Array(new Int8Array()) →${TypeUtil.isInt8Array(newInt8Array())});})// Int16Array有符号16位this.Btn(isInt16Array(new Int16Array()) → true,#7F8C8D,(){this.addLog(isInt16Array(new Int16Array()) →${TypeUtil.isInt16Array(newInt16Array())});})// Int32Array有符号32位this.Btn(isInt32Array(new Int32Array()) → true,#7F8C8D,(){this.addLog(isInt32Array(new Int32Array()) →${TypeUtil.isInt32Array(newInt32Array())});})// 泛型判断是否是任意 TypedArraythis.Btn(isTypedArray(new Float32Array()) → true,#626567,(){this.addLog(isTypedArray(new Float32Array()) →${TypeUtil.isTypedArray(newFloat32Array())});})运行结果isUint8Array(new Uint8Array()) → true isUint16Array(new Uint16Array()) → true isUint32Array(new Uint32Array()) → true isInt8Array(new Int8Array()) → true isInt16Array(new Int16Array()) → true isInt32Array(new Int32Array()) → true isTypedArray(new Float32Array()) → trueTypedArray 类型速查类型范围常用场景Uint8Array0~255字节流、图片数据、网络包Uint16Array0~65535音频采样、字符编码Uint32Array0~4294967295像素数据RGBA、哈希Int8Array-128~127有符号字节数据Int16Array-32768~32767音频PCMInt32Array-231~231-1整型缓冲区Float32Array32位浮点WebGL/图形计算如果你只想知道这是不是某种TypedArray不在乎具体是哪种用isTypedArray()最简单。实际使用示例处理二进制数据时经常需要判断传入的是哪种类型functionhandleBinaryData(data:Uint8Array|ArrayBuffer){if(TypeUtil.isUint8Array(data)){// 直接用字节视图处理for(leti0;idata.length;i){console.log(data[i]);}}elseif(TypeUtil.isArrayBuffer(data)){// 先包装成视图constviewnewUint8Array(data);// ... 处理}}写在最后容器类型和特殊对象的判断用 TypeUtil 比自己写instanceof或者Object.prototype.toString.call()方便太多了。记住最常用的几个容器isMap、isSet时间isDate别用字符串当Date用正则isRegExp二进制isArrayBuffer、isUint8Array、isTypedArray
HarmonyOS ArkTS 精确类型检测进阶:TypedArray 系列与容器类型完全指南
文章目录背景方法总览Map / WeakMap / Set / WeakSetDate / RegExp / DataViewArrayBuffer 系列TypedArray 系列Uint8Array、Int32Array 等实际使用示例写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓方法总览Map / WeakMap / Set / WeakSet这四个是 JavaScript/TypeScript 的标准容器类型TypeUtil 分别提供了对应的检测方法// Map 检测this.Btn(isMap(new Map()) → true,#16A085,(){this.addLog(isMap(new Map()) →${TypeUtil.isMap(newMap())});})this.Btn(isMap({}) → false,#16A085,(){constobj:SampleObj{a:0};this.addLog(isMap({}) →${TypeUtil.isMap(obj)});})// WeakMap 检测this.Btn(isWeakMap(new WeakMap()) → true,#1ABC9C,(){this.addLog(isWeakMap(new WeakMap()) →${TypeUtil.isWeakMap(newWeakMap())});})// Set 检测this.Btn(isSet(new Set([1,2])) → true,#2ECC71,(){this.addLog(isSet(new Set([1,2])) →${TypeUtil.isSet(newSet([1,2]))});})// WeakSet 检测this.Btn(isWeakSet(new WeakSet()) → true,#27AE60,(){this.addLog(isWeakSet(new WeakSet()) →${TypeUtil.isWeakSet(newWeakSet())});})运行结果isMap(new Map()) → true isMap({}) → false isWeakMap(new WeakMap()) → true isSet(new Set([1,2])) → true isWeakSet(new WeakSet()) → true实际使用场景接受通用参数的函数需要判断传入的是Map还是普通对象{}functionprocessData(data:Mapstring,number|Recordstring,number){if(TypeUtil.isMap(data)){// 按 Map 处理data.forEach((v,k)console.log(k,v));}else{// 按对象处理Object.entries(data).forEach(([k,v])console.log(k,v));}}Date / RegExp / DataView// Date 检测this.Btn(isDate(new Date()) → true,#F39C12,(){this.addLog(isDate(new Date()) →${TypeUtil.isDate(newDate())});})this.Btn(isDate(2024-01-01) → false,#F39C12,(){this.addLog(isDate(2024-01-01) →${TypeUtil.isDate(2024-01-01)});})// RegExp 检测this.Btn(isRegExp(/abc/g) → true,#E67E22,(){this.addLog(isRegExp(/abc/g) →${TypeUtil.isRegExp(/abc/g)});})// DataView 检测this.Btn(isDataView(new DataView(buf)) → true,#D35400,(){constbufnewArrayBuffer(8);constdvnewDataView(buf);this.addLog(isDataView(new DataView(buf)) →${TypeUtil.isDataView(dv)});})运行结果isDate(new Date()) → true isDate(2024-01-01) → false isRegExp(/abc/g) → true isDataView(new DataView(buf)) → trueisDate(2024-01-01)返回false这个很重要——字符串日期不是 Date 对象不能直接调.getFullYear()等方法。ArrayBuffer 系列// ArrayBuffer 检测this.Btn(isArrayBuffer(new ArrayBuffer(4)) → true,#2C3E50,(){this.addLog(isArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isArrayBuffer(newArrayBuffer(4))});})// AnyArrayBuffer包含 SharedArrayBufferthis.Btn(isAnyArrayBuffer(new ArrayBuffer(4)) → true,#2C3E50,(){this.addLog(isAnyArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isAnyArrayBuffer(newArrayBuffer(4))});})运行结果isArrayBuffer(new ArrayBuffer(4)) → true isAnyArrayBuffer(new ArrayBuffer(4)) → trueisArrayBuffer只检测ArrayBufferisAnyArrayBuffer还包含SharedArrayBuffer共享内存缓冲区。TypedArray 系列Uint8Array、Int32Array 等TypedArray 是一系列类型化数组视图常用于二进制数据处理、网络传输、图像处理等场景// Uint8Array无符号8位常用于字节数组this.Btn(isUint8Array(new Uint8Array()) → true,#34495E,(){this.addLog(isUint8Array(new Uint8Array()) →${TypeUtil.isUint8Array(newUint8Array())});})// Uint16Array无符号16位this.Btn(isUint16Array(new Uint16Array()) → true,#34495E,(){this.addLog(isUint16Array(new Uint16Array()) →${TypeUtil.isUint16Array(newUint16Array())});})// Uint32Array无符号32位this.Btn(isUint32Array(new Uint32Array()) → true,#34495E,(){this.addLog(isUint32Array(new Uint32Array()) →${TypeUtil.isUint32Array(newUint32Array())});})// Int8Array有符号8位this.Btn(isInt8Array(new Int8Array()) → true,#7F8C8D,(){this.addLog(isInt8Array(new Int8Array()) →${TypeUtil.isInt8Array(newInt8Array())});})// Int16Array有符号16位this.Btn(isInt16Array(new Int16Array()) → true,#7F8C8D,(){this.addLog(isInt16Array(new Int16Array()) →${TypeUtil.isInt16Array(newInt16Array())});})// Int32Array有符号32位this.Btn(isInt32Array(new Int32Array()) → true,#7F8C8D,(){this.addLog(isInt32Array(new Int32Array()) →${TypeUtil.isInt32Array(newInt32Array())});})// 泛型判断是否是任意 TypedArraythis.Btn(isTypedArray(new Float32Array()) → true,#626567,(){this.addLog(isTypedArray(new Float32Array()) →${TypeUtil.isTypedArray(newFloat32Array())});})运行结果isUint8Array(new Uint8Array()) → true isUint16Array(new Uint16Array()) → true isUint32Array(new Uint32Array()) → true isInt8Array(new Int8Array()) → true isInt16Array(new Int16Array()) → true isInt32Array(new Int32Array()) → true isTypedArray(new Float32Array()) → trueTypedArray 类型速查类型范围常用场景Uint8Array0~255字节流、图片数据、网络包Uint16Array0~65535音频采样、字符编码Uint32Array0~4294967295像素数据RGBA、哈希Int8Array-128~127有符号字节数据Int16Array-32768~32767音频PCMInt32Array-231~231-1整型缓冲区Float32Array32位浮点WebGL/图形计算如果你只想知道这是不是某种TypedArray不在乎具体是哪种用isTypedArray()最简单。实际使用示例处理二进制数据时经常需要判断传入的是哪种类型functionhandleBinaryData(data:Uint8Array|ArrayBuffer){if(TypeUtil.isUint8Array(data)){// 直接用字节视图处理for(leti0;idata.length;i){console.log(data[i]);}}elseif(TypeUtil.isArrayBuffer(data)){// 先包装成视图constviewnewUint8Array(data);// ... 处理}}写在最后容器类型和特殊对象的判断用 TypeUtil 比自己写instanceof或者Object.prototype.toString.call()方便太多了。记住最常用的几个容器isMap、isSet时间isDate别用字符串当Date用正则isRegExp二进制isArrayBuffer、isUint8Array、isTypedArray