本文详细解析 JavaScript 的七种原始类型(Undefined、Null、Boolean、Number、String、BigInt、Symbol)及引用类型 Object。重点对比了 typeof、instanceof、constructor 和 Object.prototype.toString.call() 四种判断方法,分析各自优缺点与适用场景,帮助开发者准确识别数据类型。
前言
JavaScript 数据类型分类
JavaScript 目前定义了 7 种基本(原始primitives)数据类型 Undefined,Null,Boolean,Number,String,BigInt,Symbol,以及一种引用类型 Object。在 Object 范畴内,还涵盖 Function,Date,JSON,RegExp 等内置对象。除上述 7 种原始类型外,其余所有可通过 new 关键字实例化的内置类型,均属于 Object 构造函数的实例。
数据类型
对于数据类型,我们可以通过 typeof 运算符进行初步判断,具体返回结果可参考下图。

原始类型中两个比较特殊的就是 Undefined 和 Null,它们各自仅包含一个值,分别是 undefined 和 null。
原始类型详解
Undefined
undefined 通常表示变量已声明但未初始化。当使用 typeof 操作符检查未声明的变量时,同样会返回 undefined;此外,未设置返回值的函数执行结果为 undefined,未传入的参数默认值为 undefined。需注意,undefined 并非 JavaScript 保留字,而是全局对象的一个属性,在浏览器环境中对应 window.undefined。在局部作用域中,用户可以重新赋值 undefined 属性(即重写 undefined)。为确保获取未被重写的 undefined 值,建议使用 void 0 表达式替代。
Null
null 可简单理解为空对象引用,例如调用 document.getElementById 未找到对应元素时返回 null。null 与 undefined 存在区别:在转换为 Number 时,null 转为 0 ,而 undefined 转为 NaN;执行 typeof 运算时,undefined 返回 undefined,null 返回 object。使用 == 判断两者相等会返回 true,因此为防止误判,通常推荐使用全等 === 进行比较。null 是对象原型链的终点,Object.prototype.__proto__ === null。
关于 null 的使用,当声明变量用于存储对象时,可先赋值为 null;当对象不再需要时,将其设置为 null 以解除引用。
Symbol 和 BigInt
这两者均为 ES6 新增的原始数据类型。Symbol 类型的数据通过 Symbol() 方法生成,需注意 Symbol 不能作为构造函数,每个从 Symbol() 返回的 symbol 值都是唯一的。symbol 值可作为对象属性的标识符,这也是该类型的主要用途。
而 BigInt 则是为了精确表示超出双精度浮点数最大安全范围的大数而新增的基本数据类型。
数据类型判断方法
判断数据类型的方法
typeof 运算符
判断数据类型最简单的方法是 typeof 运算符,其返回值为字符串。typeof 的缺点在于,除 Function 外,所有其他对象的返回值均为 object(null 的返回值也是 object)。若需区分不同对象类型,typeof 无法满足需求。
instanceof 运算符
instanceof 运算符用于检测构造函数的原型是否出现在对象的原型链上。通过 instanceof 运算符,我们可以对 Object 类型进行细分,确定具体对象类型。但 instanceof 的局限性在于它仅能检测对象,无法检测基本数据类型的实例(字面量无法检测,但通过基本包装类型的构造函数创建的基本类型可以检测)。
constructor 属性
利用实例的 constructor 属性辅助判断数据类型也是一种手段。通常实例本身没有 constructor 属性,我们访问到的实际上是 实例.__proto__.constructor,即实例的构造函数。该方法对基本数据类型也有效。但此方法的主要问题是 constructor 属性不受保护,随时可能被更改:既可为实例添加 constructor 属性,也可修改构造函数的 prototype 引用,或直接修改原型的 constructor 属性。
Object.prototype.toString.call()
这是最安全且准确的数据类型检测方法。每种数据类型的构造函数原型上都有 toString 方法,但除 Object.prototype 上的 toString 用于返回当前实例所属类信息(即检测数据类型)外,其余均为转换为字符串的方法。该方法可准确检测所有内置类型。自定义类型的返回值为 Object Object。
let toString = Object.prototype.toString //=>Object.prototype.toString
console.log(toString.call(10)); //=>"[object Number]"
console.log(toString.call(NaN)); //=>"[object Number]"
console.log(toString.call("xxx")); //=>"[object String]"
console.log(toString.call(true)); //=>"[object Boolean]"
console.log(toString.call(null)); //=>"[object Null]"
console.log(toString.call(undefined)); //=>"[object Undefined]"
console.log(toString.call(Symbol())); //=>"[object Symbol]"
console.log(toString.call(BigInt(10))); //=>"[object BigInt]"
console.log(toString.call({xxx:'xxx'})); //=>"[object Object]"
console.log(toString.call([10,20])); //=>"[object Array]"
console.log(toString.call(/^\d+$/)); //=>"[object RegExp]"
console.log(toString.call(function(){})); //=>"[object Function]"
以上就是详解 JavaScript 数据类型和判断方法的详细内容,更多关于 JavaScript 数据类型和判断方法的资料请关注本站其它相关文章!