Javascript中的数据类型有哪些_如何进行准确的Javascript类型判断?

12次阅读

javaScript原始类型有7种:StringnumberBooleanNULLundefinedsymbol、bigint;其余均为对象类型,包括ObjectArrayfunction等。typeof对原始类型基本可靠(null除外),但对所有对象均返回”object”,故无法区分数组、日期等;准确判断应使用Object.prototype.toString.call(),它通过[[class]]标签返回统一格式字符串,如”[object Array]”,且跨环境稳定可靠。

Javascript中的数据类型有哪些_如何进行准确的Javascript类型判断?

javascript 中的原始类型和对象类型有哪些

JavaScript 有 7 种原始(primitive)类型:stringnumberbooleannullundefinedsymbolbigint。其余都是对象类型,包括 ObjectArrayFunctiondateregexpmapSetpromise,以及自定义的类实例等。

注意:typeof null 返回 "object" 是历史遗留 bug,不能靠它判断 nulltypeof []typeof {} 都返回 "object",也无法区分数组和普通对象。

typeof 判断原始类型时要注意什么

typeof 只对原始类型基本可靠(除 null),对函数返回 "function" 是特例,但对所有其他对象一律返回 "object",因此它不是“万能类型检测工具”。

  • typeof "hello""string"
  • typeof 42"number"
  • typeof true"boolean"
  • typeof undefined"undefined"
  • typeof Symbol()"symbol"
  • typeof 1n"bigint"
  • typeof null"object"(❌ 错误,需单独判断)
  • typeof []"object"(❌ 无法识别数组)

如何准确判断数组、日期、正则等内置对象类型

推荐统一使用 Object.prototype.toString.call(),它是目前最可靠、可扩展的类型检测方式。每个内置构造器在内部都设置了 [[Class]] 标签,toString 方法会读取并格式化为 [object Xxx] 字符串。

立即学习Java免费学习笔记(深入)”;

Object.prototype.toString.call([])        // "[object Array]" Object.prototype.toString.call(new Date()) // "[object Date]" Object.prototype.toString.call(/abc/)      // "[object RegExp]" Object.prototype.toString.call(null)       // "[object Null]" Object.prototype.toString.call(undefined)  // "[object Undefined]" Object.prototype.toString.call(123)        // "[object Number]"

你可以封装一个通用函数:

function getType(value) {   return Object.prototype.toString.call(value).slice(8, -1); } getType([1, 2])     // "Array" getType(new Set())  // "Set" getType(Promise.resolve()) // "Promise"

为什么不用 instanceof 或构造器名判断

instanceof 在跨 iframe 或不同执行上下文(如 Web Worker)中会失效,因为不同环境中的 Array 构造器是不同引用;而直接访问 value.constructor.name 不仅不可靠(可被篡改),对原始值还可能报错(如 42.constructorundefined)。

  • [] instanceof Array 在当前窗口下成立,但在 iframe 里创建的数组会返回 false
  • ({}).constructor === Object 可能被重写,比如 obj.constructor = null
  • 42.constructorTypeError(原始值没有属性访问能力,js 会临时包装,但 constructor 属性不在包装对象上)

真正需要高精度判断时,Object.prototype.toString 是唯一不依赖运行时环境、不依赖可变属性、且覆盖全部标准类型的方案。

text=ZqhQzanResources