当前位置: 首页 > news >正文

JavaScript 数据类型详解

JavaScript 数据类型详解

JavaScript 数据类型分为 原始类型(Primitive)对象类型(Object) 两大类,共 8 种(ES11+):


一、原始类型(7种)

1. undefined
  • 定义:未赋值的变量默认值
  • 特点
    • 变量声明未初始化时值为 undefined
    • 函数无返回值时返回 undefined
  • 检测
    let a;
    console.log(a); // undefined
    console.log(typeof a); // "undefined"
    
2. null
  • 定义:表示 空值对象不存在
  • 关键点
    • typeof null === "object"(历史遗留问题)
    • undefined 区别:null 需显式赋值
    let b = null;
    console.log(b === null); // true
    
3. boolean
  • 值域true / false
  • 隐式转换规则
    值类型转 boolean 结果
    0, NaNfalse
    非零数字true
    ""false
    非空字符串true
    null/undefinedfalse
    对象/数组true
4. number
  • 定义:双精度 64 位浮点数(IEEE 754)
  • 特殊值
    • NaN(Not a Number):无效数学操作结果
    • Infinity / -Infinity:超出数值范围
    • Number.MAX_SAFE_INTEGER(2⁵³ - 1)
  • 示例
    console.log(0.1 + 0.2); // 0.30000000000000004(精度问题)
    console.log(1 / 0);     // Infinity
    console.log(Math.sqrt(-1)); // NaN
    
5. bigint(ES2020)
  • 定义:表示任意精度的整数
  • 语法:数字末尾加 n
  • 用途:处理超过 Number.MAX_SAFE_INTEGER 的值
    const bigNum = 9007199254740991n;
    console.log(bigNum + 1n); // 9007199254740992n
    
6. string
  • 定义:UTF-16 编码的文本序列
  • 特性
    • 不可变(修改会创建新字符串)
    • 模板字符串支持插值:`Hello ${name}`
  • 转义字符\n, \t, \u{1F600}(表情符号)
7. symbol(ES6)
  • 定义:唯一且不可变的标识符
  • 用途
    • 创建对象唯一属性键
    • 避免命名冲突
    const id = Symbol("unique_id");
    const obj = { [id]: 123 };
    console.log(obj[id]); // 123
    

二、对象类型(1种,包含子类)

1. Object
  • 定义:键值对集合(属性 + 方法)
  • 子类
    类型用途示例
    Array有序数据集合[1, 2, 3]
    Function可执行对象function foo() {}
    Date日期时间处理new Date()
    RegExp正则表达式/\d+/g
    Map/Set键值对/唯一值集合new Map([['key', 1]])
    Promise异步操作管理new Promise(...)
    Error错误信息封装new Error("msg")
对象特性:
  1. 引用传递

    const obj1 = { x: 1 };
    const obj2 = obj1;
    obj2.x = 2;
    console.log(obj1.x); // 2(共享内存)
    
  2. 原型继承

    const arr = [];
    console.log(arr.__proto__ === Array.prototype); // true
    

三、类型检测方法对比

方法适用场景局限性
typeof原始类型检测typeof null => "object"
instanceof检测对象实例的构造函数不适用于原始类型
Array.isArray()专检数组仅限数组
Object.prototype.toString.call()最准确类型判断需配合调用

精准类型检测函数

function getType(value) {return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}console.log(getType(null));      // "null"
console.log(getType(/regex/));   // "regexp"
console.log(getType(new Map())); // "map"

四、类型转换机制

1. 显式转换
Number("123");    // 123
String(true);     // "true"
Boolean([]);      // true
2. 隐式转换(易错点)
1 + "2"       // "12"(数字转字符串)
"5" - true    // 4(布尔转数字)
[] == 0       // true([]转""再转0)
null >= 0     // true(null转0)

关键总结

  1. 原始类型:直接存储值,不可变(7种)
  2. 对象类型:存储内存引用,可变(含多种子类)
  3. 类型检测:优先用 Object.prototype.toString.call()
  4. 转换原则
    • 数学运算:尝试转数字
    • + 运算:遇字符串则拼接
    • == 比较:触发隐式转换(建议用 ===

💡 特殊记忆

  • NaN 是唯一不等于自身的值:NaN !== NaN
  • typeof function() {} 返回 "function"(历史遗留)
http://www.xdnf.cn/news/936253.html

相关文章:

  • Razor编程中@Html的方法使用大全
  • Day25 异常处理
  • sizeof 与strlen的区别
  • Puppeteer测试框架 - Node.js
  • 解决transformers.adapters import AdapterConfig 报错的问题
  • Java中的抽象类
  • 【Redis】持久化
  • Redis知识体系
  • 【深度学习】表示学习:深度学习的数据解构与重构艺术
  • Effective Java 第三版 第二三章总结
  • Selenium自动化操作
  • Java中双端队列的多种实现类详解
  • 力扣面试150题--课程表
  • LabVIEW多道心电记录仪
  • 【靶场】XXE-Lab xxe漏洞
  • Java严格模式withResolverStyle解析日期错误及解决方案
  • PLC入门【1】PLC的简单介绍(教学软件:FX-TRN-BEG-C)
  • Spring Boot中Bean注入方式对比与最佳实践
  • AUTOSAR实战教程--开放式通用DoIP刷写工具OpenOTA开发计划
  • 分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)
  • MCP Tool模块详解
  • 听写流程自动化实践,轻量级教育辅助
  • 【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • Unity中如何播放视频
  • 数据结构——F/图
  • 一个一键生成知识讲解类教育视频的ai工具
  • 从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十一)
  • 【MySQL系列】MySQL 导出表数据到文件
  • 内存分配基础:修改SCT文件的简单例子
  • JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作