《前端面试题:JS数据类型》

news2025/6/7 23:31:38

JavaScript 数据类型指南:从基础到高级全解析

一、JavaScript 数据类型概述

JavaScript 作为一门动态类型语言,其数据类型系统是理解这门语言的核心基础。在 ECMAScript 标准中,数据类型分为两大类:

1. 原始类型(Primitive Types)

  • 存储在栈内存中
  • 按值访问
  • 不可变(immutable)
  • 包括:Undefined, Null, Boolean, Number, String, Symbol, BigInt

2. 引用类型(Reference Types)

  • 存储在堆内存中
  • 按引用访问
  • 可变(mutable)
  • 包括:Object及其子类型(Array, Function, Date, RegExp等)
JavaScript 数据类型
基本类型 Primitive
引用类型 Reference
Number
String
Boolean
Null
Undefined
Symbol
BigInt
Object
Array
Function
Date
Map/Set

图:JavaScript 数据类型分类及内存结构

二、原始数据类型详解

1. Undefined 类型

特征

  • 表示变量已声明但未赋值
  • 类型为 "undefined",值为 undefined
let uninitialized;
console.log(typeof uninitialized); // "undefined"
console.log(uninitialized === undefined); // true

常见场景

  • 未初始化的变量
  • 函数无返回值
  • 函数参数未传递

2. Null 类型

特征

  • 表示"无对象"或"空引用"
  • 类型为 "object"(历史遗留问题),值为 null
let empty = null;
console.log(typeof empty); // "object" (特殊历史原因)
console.log(empty === null); // true

面试题nullundefined 的区别?
答案

  • undefined 表示未定义(变量声明未赋值)
  • null 表示空对象引用(主动赋值)

3. Boolean 类型

特征

  • 仅有两个值:truefalse
  • 用于逻辑判断和控制流程
let isActive = true;
let isCompleted = false;

// 自动转换规则
console.log(Boolean(0)); // false
console.log(Boolean("hello")); // true
console.log(Boolean(null)); // false

真值(Truthy)与假值(Falsy)

假值(Falsy)真值(Truthy)
falsetrue
0, -0, NaN非零数字
""(空字符串)非空字符串
null任何对象
undefined数组(即使空数组)
function(){}

4. Number 类型

特征

  • 双精度64位浮点数(遵循IEEE 754标准)
  • 表示整数和浮点数
  • 特殊值:Infinity, -Infinity, NaN
let integer = 42;
let float = 3.14159;
let hex = 0xFF; // 255
let binary = 0b1010; // 10 (ES6)
let octal = 0o755; // 493 (ES6)

// 特殊数值
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log(0 / 0); // NaN

// 精度问题(IEEE 754)
console.log(0.1 + 0.2 === 0.3); // false

解决精度问题

// 使用toFixed处理显示
console.log((0.1 + 0.2).toFixed(2)); // "0.30"

// 转换为整数计算
const result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result); // 0.3

5. String 类型

特征

  • 表示文本数据
  • 不可变(任何修改都创建新字符串)
  • 支持UTF-16编码
let name = "Alice";
let greeting = 'Hello, ' + name + '!'; // 传统拼接
let template = `Hello, ${name}!`; // 模板字符串(ES6)

// 字符串方法
console.log(name.length); // 5
console.log(name.charAt(0)); // "A"
console.log(name.includes("li")); // true
console.log("hello".repeat(3)); // "hellohellohello"

特殊字符

console.log("First line\nSecond line"); // 换行
console.log("Path: C:\\Windows\\System32"); // 转义
console.log("\u{1F600}"); // 😀 (Unicode表情)

6. Symbol 类型(ES6)

特征

  • 表示唯一标识符
  • 避免属性名冲突
  • 不可枚举(默认)
// 创建Symbol
const id = Symbol("unique identifier");
const id2 = Symbol("unique identifier");

console.log(id === id2); // false (每个Symbol都是唯一的)

// 对象属性
const user = {
  name: "Alice",
  [id]: 12345 // Symbol作为键
};

console.log(Object.keys(user)); // ["name"] (Symbol属性不可枚举)
console.log(Reflect.ownKeys(user)); // ["name", Symbol(unique identifier)]

全局Symbol注册表

// 创建或获取全局Symbol
const globalId = Symbol.for("global.id");
const sameId = Symbol.for("global.id");

console.log(globalId === sameId); // true
console.log(Symbol.keyFor(globalId)); // "global.id"

7. BigInt 类型(ES2020)

特征

  • 表示任意精度的整数
  • 解决 Number 类型精度限制
  • 字面量加 n 后缀
// 超过Number安全范围
const maxSafe = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(maxSafe + 1 === maxSafe + 2); // true!

// BigInt解决方案
const bigNum = 9007199254740991n;
console.log(bigNum + 1n); // 9007199254740992n
console.log(bigNum + 2n); // 9007199254740993n

// 类型转换
console.log(10n === 10); // false (类型不同)
console.log(10n == 10); // true (值相等)

三、引用数据类型详解

1. Object 类型

特征

  • 键值对集合
  • 原型链继承机制
  • 引用传递
// 对象创建
const person = {
  name: "Alice",
  age: 30,
  greet() {
    return `Hello, I'm ${this.name}`;
  }
};

// 动态属性
person.job = "Engineer";
delete person.age;

// 属性访问
console.log(person.name); // "Alice"
console.log(person["job"]); // "Engineer"
console.log(person.greet()); // "Hello, I'm Alice"

2. Array 类型

特征

  • 有序数据集合
  • 特殊类型的对象
  • 索引从0开始
// 数组创建
const fruits = ["Apple", "Banana", "Orange"];

// 常用方法
fruits.push("Mango"); // 末尾添加
fruits.pop(); // 移除末尾
fruits.unshift("Strawberry"); // 开头添加
fruits.shift(); // 移除开头

// 高阶函数
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(n => n * 2); // [2, 4, 6, 8]
const sum = numbers.reduce((total, num) => total + num, 0); // 10

// 数组解构(ES6)
const [first, second] = fruits;
console.log(first); // "Apple"

3. Function 类型

特征

  • 可执行对象
  • 一等公民(可作为参数和返回值)
  • 闭包支持
// 函数定义
function add(a, b) {
  return a + b;
}

// 函数表达式
const multiply = function(x, y) {
  return x * y;
};

// 箭头函数(ES6)
const divide = (a, b) => a / b;

// 高阶函数
function createMultiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

const double = createMultiplier(2);
console.log(double(5)); // 10

4. Date 类型

特征

  • 表示日期和时间
  • 基于UTC时间
  • 月份从0开始(0=1月)
const now = new Date();
console.log(now.toString()); // "Thu Aug 05 2023 14:30:00 GMT+0800"

// 特定日期
const birthday = new Date(1990, 6, 15); // 1990年7月15日

// 日期计算
const msDiff = now - birthday;
const years = msDiff / (1000 * 60 * 60 * 24 * 365.25);
console.log(Math.floor(years)); // 年龄

// 日期格式化
console.log(now.toLocaleDateString("zh-CN")); // "2023/8/5"

5. RegExp 类型

特征

  • 表示正则表达式
  • 用于模式匹配和文本处理
// 创建正则
const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
const anotherPattern = new RegExp("\\d{3}-\\d{4}", "g"); // 等价于/\d{3}-\d{4}/g

// 使用方法
const text = "Contact: 123-4567, 890-1234";
const matches = text.match(/\d{3}-\d{4}/g); // ["123-4567", "890-1234"]

// 测试匹配
console.log(emailPattern.test("user@example.com")); // true
console.log(emailPattern.test("invalid@.com")); // false

四、类型检测与转换

1. 类型检测方法

方法优点缺点示例
typeof基本类型检测null返回"object"typeof "hello" // "string"
instanceof检测对象类型不适用基本类型[] instanceof Array // true
Array.isArray()精确检测数组仅适用于数组Array.isArray([]) // true
Object.prototype.toString.call()最准确方法语法较复杂Object.prototype.toString.call(null) // "[object Null]"

2. 类型转换

显式转换

// 转数字
console.log(Number("42")); // 42
console.log(parseInt("10px", 10)); // 10
console.log(parseFloat("3.14em")); // 3.14

// 转字符串
console.log(String(42)); // "42"
console.log((123).toString()); // "123"

// 转布尔
console.log(Boolean(1)); // true
console.log(!!"hello"); // true (双非运算符)

隐式转换

// 字符串拼接
console.log("Value: " + 10); // "Value: 10"

// 数学运算
console.log("5" * "2"); // 10 (自动转数字)
console.log("5" + "2"); // "52" (字符串拼接)

// 相等比较
console.log(1 == "1"); // true (类型转换)
console.log(1 === "1"); // false (严格相等)

五、核心面试题解析

1. 如何准确判断数组类型?

// 最佳实践
function isArray(target) {
  return Array.isArray(target);
}

// 兼容方案
function isArrayCompat(target) {
  return Object.prototype.toString.call(target) === "[object Array]";
}

2. 深拷贝如何实现?

// JSON方法(有局限)
const deepCopy = obj => JSON.parse(JSON.stringify(obj));

// 递归实现
function deepClone(source) {
  if (source === null || typeof source !== "object") {
    return source;
  }
  
  const clone = Array.isArray(source) ? [] : {};
  
  for (let key in source) {
    if (source.hasOwnProperty(key)) {
      clone[key] = deepClone(source[key]);
    }
  }
  
  return clone;
}

3. 如何理解闭包及其应用场景?

答案
闭包是函数与其词法环境的组合,使函数可以访问其定义时的作用域。应用场景:

  • 封装私有变量
  • 函数工厂
  • 模块模式
  • 回调函数
// 计数器闭包
function createCounter() {
  let count = 0;
  
  return {
    increment() {
      count++;
      return count;
    },
    decrement() {
      count--;
      return count;
    },
    getCount() {
      return count;
    }
  };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2

4. == 和 === 的区别是什么?

答案

  • ==:抽象相等,会进行类型转换
  • ===:严格相等,要求类型和值都相同
console.log(1 == "1"); // true (类型转换)
console.log(1 === "1"); // false (类型不同)

console.log(null == undefined); // true (特殊规则)
console.log(null === undefined); // false

5. 如何检测NaN?

// 标准方法
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("text")); // false

// 传统方法
function isNaN(value) {
  return value !== value; // NaN是唯一不等于自身的值
}

六、高级数据类型技巧

1. 类型守卫

// TypeScript中的类型守卫
function processValue(value: string | number) {
  if (typeof value === "string") {
    return value.toUpperCase();
  }
  return value.toFixed(2);
}

// JavaScript中的类型检查
function formatValue(value) {
  if (typeof value === "string") {
    return value.trim().toUpperCase();
  }
  
  if (Array.isArray(value)) {
    return value.join(", ");
  }
  
  return value.toString();
}

2. 可选链操作符(?.)

const user = {
  profile: {
    name: "Alice",
    address: {
      city: "Beijing"
    }
  }
};

// 传统方式
const city = user && user.profile && user.profile.address && user.profile.address.city;

// 可选链
const citySafe = user?.profile?.address?.city;
console.log(citySafe); // "Beijing"

// 函数调用
const result = someObject?.someMethod?.();

3. 空值合并运算符(??)

// 设置默认值
const config = {
  timeout: 0
};

// 传统方式(0会被覆盖)
const timeout = config.timeout || 1000; // 1000

// 空值合并(仅对null/undefined生效)
const timeoutCorrect = config.timeout ?? 1000; // 0

七、总结:JavaScript 数据类型要点

  1. 两大类别

    • 原始类型:Undefined, Null, Boolean, Number, String, Symbol, BigInt
    • 引用类型:Object, Array, Function, Date, RegExp
  2. 核心特性

    • 原始类型不可变,引用类型可变
    • 原始类型按值访问,引用类型按引用访问
    • 动态类型系统允许变量类型改变
  3. 最佳实践

    • 优先使用 === 严格相等
    • 使用 Array.isArray() 检测数组
    • 使用 Object.prototype.toString.call() 精确类型检测
    • 理解隐式转换规则避免陷阱
  4. 现代特性

    • 使用 Symbol 创建唯一标识
    • 使用 BigInt 处理大整数
    • 使用可选链和空值合并简化代码

掌握数据类型的重要性
深入理解JavaScript数据类型是成为高级开发者的基础。它不仅影响代码的正确性和性能,还决定了开发者能否充分利用JavaScript的动态特性构建健壮的应用程序。通过本文的学习,你应该能够:

  1. 准确区分各种数据类型
  2. 正确处理类型转换和比较
  3. 避免常见类型相关陷阱
  4. 应用现代类型特性提升代码质量

最后建议:在复杂项目中考虑使用TypeScript,它能在编译时提供强大的类型检查,显著减少运行时类型错误。

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

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

相关文章

PPT转图片拼贴工具 v4.3

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 效果展示 支持导入文件和支持导入文件夹,也支持手动输入文件/文件夹路径 软件界面 这一次提供了源码和开箱即用版本,exe就是直接用就可以了。 软件源码 import os import re import sys …

Chrome安装代理插件ZeroOmega(保姆级别)

目录 本文直接讲解一下怎么本地安装ZeroOmega一、下载文件在GitHub直接下ZeroOmega 的文件(下最新版即可) 二、安装插件打开 Chrome 浏览器,访问 chrome://extensions/ 页面(扩展程序管理页面),并打开开发者…

Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)

Transformer-BiGRU多变量时序预测(Matlab完整源码和数据) 目录 Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-BiGRU多变量时间序列预测&…

新华三H3CNE网络工程师认证—Easy IP

Easy IP 就是“用路由器自己的公网IP,给全家所有设备当共享门牌号”的技术!(省掉额外公网IP,省钱又省配置!) 生活场景对比,想象你住在一个小区:普通动态NAT:物业申请了 …

Excel 模拟分析之单变量求解简单应用

正向求解 利用公式根据贷款总额、还款期限、贷款利率,求每月还款金额 反向求解 根据每月还款能力,求最大能承受贷款金额 参数: 目标单元格:求的值所在的单元格 目标值:想要达到的预期值 可变单元格:变…

装备制造项目管理具备什么特征?如何选择适配的项目管理软件系统进行项目管控?

国内某大型半导体装备制造企业与奥博思软件达成战略合作,全面引入奥博思 PowerProject 打造企业专属项目管理平台,进一步提升智能制造领域的项目管理效率与协同能力。 该项目管理平台聚焦半导体装备研发与制造的业务特性,实现了从项目立项、…

FPGA 动态重构配置流程

触发FPGA 进行配置的方式有两种,一种是断电后上电,另一种是在FPGA运行过程中,将PROGRAM 管脚拉低。将PROGRAM 管脚拉低500ns 以上就可以触发FPGA 进行重构。 FPGA 的配置过程大致可以分为:配置的触发和建立阶段、加载配置文件和建…

网络安全逆向分析之rust逆向技巧

rust逆向技巧 rust逆向三板斧: 快速定位关键函数 (真正的main函数):观察输出、输入,字符串搜索,断点等方法。定位关键 加密区 :根据输入的flag,打硬件断点,快速捕获程序中对flag访问的位置&am…

Leetcode 2494. 合并在同一个大厅重叠的活动

1.题目基本信息 1.1.题目描述 表: HallEvents ----------------- | Column Name | Type | ----------------- | hall_id | int | | start_day | date | | end_day | date | ----------------- 该表可能包含重复字段。 该表的每一行表示活动的开始日期和结束日期&…

vue+elementui 网站首页顶部菜单上下布局

菜单集合后台接口动态获取&#xff0c;保存到store vuex状态管理器 <template><div id"app"><el-menu:default-active"activeIndex2"class"el-menu-demo"mode"horizontal"select"handleSelect"background-…

网络安全-等级保护(等保) 3-3-1 GB/T 36627-2018 附录A (资料性附录) 测评后活动、附 录 B (资料性附录)渗透测试的有关概念说明

################################################################################ GB/T 36627-2018 《信息安全技术 网络安全等级保护测试评估技术指南》对网络安全等级保护测评中的相关测评技术进行明确的分类和定义,系统地归纳并阐述测评的技术方法,概述技术性安全测试和…

pytorch3d+pytorch1.10+MinkowskiEngine安装

1、配置pytorch1.10cuda11.0 pip install torch1.10.1cu111 torchvision0.11.2cu111 torchaudio0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html 2、配置 MinkowskiEngine库 不按下面步骤&#xff0c;出现错误 1、下载MinkowskiEngine0.5.4到本地 2、查看…

AI Infra运维实践:DeepSeek部署运维中的软硬结合

发布会资料 《AI Infra运维实践&#xff1a;DeepSeek部署运维中的软硬结合》 袋鼠云运维服务 1、行业痛点 随着数字化转型的深入&#xff0c;企业面临的运维挑战日益复杂&#xff0c;所依托的平台在长期使用的过程中积累了各式各样的问题或者难点。这些问题不仅影响效率&…

MySQL体系架构解析(二):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…

K8s基础一

Kubernetes 架构 Kubernetes 背后的架构概念。 Kubernetes 集群由一个控制平面和一组用于运行容器化应用的工作机器组成&#xff0c; 这些工作机器称作节点&#xff08;Node&#xff09;。每个集群至少需要一个工作节点来运行 Pod。 工作节点托管着组成应用负载的 Pod。控制平…

2025五大免费变声器推荐!

在游戏开黑时想靠声音搞怪活跃气氛&#xff0c;或是在直播中用独特声线吸引观众&#xff0c;又或者给视频配音时想尝试不同角色 —— 但市面上的变声软件要么收费高昂&#xff0c;要么效果生硬、操作复杂&#xff0c;难道找到一款好用又免费的变声器真的这么难&#xff1f; 今…

SDC命令详解:使用set_min_capacitance命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定最小需驱动电容值 指定对象列表/集合 简单使用 写在最后 set_min_capacitance命令用于设置输入端口的最小需驱动电容&#xff08;设置了输入端口的min_c…

几何引擎对比:OpenCasCade、ACIS、Parasolid和CGM

概述 从技术架构与行业实践来看&#xff0c;OpenCasCade 凭借开源生态与轻量化设计形成差异化竞争力&#xff0c;尤其适合预算敏感、需定制开发或依赖开源工具链的场景&#xff1b;而 ACIS、Parasolid 等商业内核则通过工业级精度优化与主流 CAD 深度绑定占据大型企业市场&…

汽车安全体系:FuSa、SOTIF、Cybersecurity 从理论到实战

汽车安全&#xff1a;功能安全&#xff08;FuSa&#xff09;、预期功能安全&#xff08;SOTIF&#xff09;与网络安全(Cybersecurity) 从理论到实战的安全体系 引言&#xff1a;自动驾驶浪潮下的安全挑战 随着自动驾驶技术从L2向L4快速演进&#xff0c;汽车安全正从“机械可靠…

Excel-vlookup -多条件匹配,返回指定列处的值

前提&#xff1a;先了解vlookup 的简单使用&#xff0c; 参照&#xff1a;https://blog.csdn.net/yanweijie0317/article/details/144886106?spm1011.2124.3001.6209 要求&#xff1a;按照Sheet0的B列和I列&#xff0c;在Sheet1中查找H列。 函数&#xff1a; VLOOKUP(B509&a…