Skip to content

数据类型

一、JavaScript 的数据类型

JavaScript 的数据类型分为两大类:

  • 基础数据类型
  • 引用数据类型

1. 基本数据类型(Primitive Types)

共有 7 种:

类型示例说明
string'hello'字符串
number123, NaN, Infinity数字(整数、浮点数、特殊值)
booleantrue / false布尔值
undefinedundefined未定义变量的默认值
nullnull表示空对象
symbolSymbol('id')唯一值(ES6)
bigint10n超大整数(ES2020)

2. 引用数据类型(Reference Types)

对象类型:

类型示例
Object{a: 1}
Array[1,2,3]
Functionfunction() {}
Date, RegExp, Map, Set

二、如何判断数据类型

这是面试高频点。判断方式不同,适用场景也不同。

1. typeof 运算符

适用于判断基本类型。

js
typeof 123; // 'number'
typeof "hi"; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Symbol(); // 'symbol'
typeof 10n; // 'bigint'

// ⚠️ 特殊情况:
typeof null; // 'object'(历史遗留 bug)
typeof []; // 'object'
typeof {}; // 'object'
typeof function () {}; // 'function'

✅ 优点:简单、常用。
❌ 缺点:对对象类类型区分不出(例如数组、null、正则等)

2. instanceof 运算符

用于判断对象的构造函数链。

js
[] instanceof Array       // true
{} instanceof Object      // true
new Date() instanceof Date // true

✅ 优点:适合判断复杂对象
❌ 缺点:无法判断基本类型;跨 iframe 会失效(不同全局作用域)

3. Object.prototype.toString.call()

最精准、最推荐的方法(尤其在框架源码中常见)。

js
Object.prototype.toString.call("hi"); // "[object String]"
Object.prototype.toString.call(123); // "[object Number]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(() => {}); // "[object Function]"

可以封装一个通用函数:

js
function getType(value) {
  return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
getType([]); // 'array'
getType(null); // 'null'

三、前端面试常见延伸问题

💬 Q1: nullundefined 的区别?

对比项undefinednull
含义变量声明了但未赋值有意表示“空”
类型undefinedobject(历史 bug)
场景系统级空值程序员主动赋值为空
👉 面试官追问:typeof null === 'object' 为什么?

因为早期 JS 使用 32 位系统存储类型标签,低三位为 000 表示对象,而 null 被误判为对象地址的零值。

💬 Q2: ===== 的区别?

  • ==:会进行类型转换
  • ===:严格比较类型和值
js
0 == false; // true
0 === false; // false
null == undefined; // true
null === undefined; // false
👉 面试官追问:JS 的类型转换规则?
  • Boolean 转数字 → true1false0
  • 字符串转数字 → "123"123
  • null 转数字 → 0
  • undefined 转数字 → NaN

💬 Q3: typeof NaN是什么?为什么?

js
typeof NaN; // "number"

因为 NaN 本质上是一个特殊的数值类型,代表 “Not-a-Number”。

💬 Q4: 如何判断一个变量是数组?

js
Array.isArray([])           // ✅ 推荐
[] instanceof Array          // ✅ 可用
Object.prototype.toString.call([]) // ✅ 精准
typeof []                    // ❌ 'object'

💬 Q5: 判断对象是否为空对象?

js
Object.keys(obj).length === 0;
// 或
JSON.stringify(obj) === "{}";

💬 Q6: 判断值是否为 NaN?

js
Number.isNaN(value); // ✅ 推荐
isNaN(value); // ⚠️ 会先做类型转换
js
isNaN("abc"); // true (因为 'abc' 转 NaN)
Number.isNaN("abc"); // false

💬 Q7: 判断引用类型的深拷贝 / 浅拷贝问题

  • 浅拷贝:复制第一层引用,内部对象仍指向同一引用。
js
const a = { x: 1, y: { z: 2 } };
const b = { ...a };
a.y.z = 100;
console.log(b.y.z); // 100
  • 深拷贝:每一层都复制。
js
const deep = structuredClone(obj);
// 或 JSON.parse(JSON.stringify(obj))(有缺陷)

四、总结如下

题号面试题考察点高分答案思路
1JS 有哪些数据类型?基础概念1. 基本类型:stringnumberbooleanundefinednullsymbolbigint
2. 引用类型:ObjectArrayFunctionDateRegExpMapSet
2typeof 的返回值有哪些?有何特殊情况?类型判断- 基本类型返回对应字符串
- 特殊情况:typeof null === 'object'typeof [] === 'object'typeof function(){} === 'function'
3nullundefined 的区别?类型理解- undefined:声明未赋值
- null:有意赋为空
- typeof null === 'object' 是历史遗留 bug
4===== 的区别?类型转换- == 会进行类型转换
- === 严格比较类型和值
- 举例说明 0 == falsenull == undefined
5如何判断一个变量是数组?引用类型判断- Array.isArray(arr) ✅ 推荐
- arr instanceof Array ✅ 可用
- Object.prototype.toString.call(arr) 精准
6如何判断对象是否为空对象?对象操作- Object.keys(obj).length === 0
- JSON.stringify(obj) === '{}'
7判断 NaN 有哪些方法?特殊值- Number.isNaN(value) ✅ 推荐
- isNaN(value) ⚠️ 会先做类型转换
- 举例区分两者差异
8如何判断一个变量的类型?综合判断- 基本类型:typeof
- 引用类型:instanceofObject.prototype.toString.call()
9数组与对象拷贝方式有哪些?浅拷贝 / 深拷贝- 浅拷贝:Object.assign() / {...obj}
- 深拷贝:structuredClone(obj)JSON.parse(JSON.stringify(obj))
- 注意 JSON 方法对函数、undefinedSymbol 不适用
10SymbolBigInt 是什么?ES6+ 新特性- Symbol:唯一值,常用作对象 key
- BigInt:超大整数,用 n 结尾,如 10n
11typeof NaN 为什么是 'number'特殊值理解- NaN 是一种特殊的数字类型,表示“不是有效数值”,属于 number 类型
12null == undefinednull === undefined 分别结果?类型比较- null == undefinedtrue
- null === undefinedfalse