当前位置: 首页 > 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"(历史遗留)

相关文章:

  • 基于深度强化学习的智能机器人导航系统
  • 骨盆-x光参数
  • Linux多线程-进阶
  • 湖北理元理律师事务所视角:企业债务优化的三维平衡之道
  • 在uniCloud云对象中定义dbJQL的便捷方法
  • 免杀对抗--PE文件结构
  • 大实验:基于赛灵思csg324100T,pmodMAXsonar的危险距离警报
  • NumPy数组访问
  • MySQL从入门到DBA深度学习指南
  • 算法-数论
  • 每日八股文6.8
  • 通过Cline使用智能体
  • WebFuture 升级提示“不能同时包含聚集KEY和大字段””的处理办法
  • DDR供电设计中的VTT与VREF作用和区别
  • 深究二分查找算法:从普通到进阶
  • 【AIGC】RAGAS评估原理及实践
  • 可可·香奈儿 活出自己
  • 使用Mathematica实现Newton-Raphson收敛速度算法(简单高阶多项式)
  • Beckhoff(倍福) -- MES(ITAC) TCP 通讯
  • Wise Disk Cleaner:免费高效的系统清理专家
  • 网站开发语言查看器/营销网络是啥意思
  • 烟台做网站打电话话术/短视频培训机构
  • 用自己的身份做网站备案/谷歌sem推广
  • 哪个网站可以找到毕业设计/友情链接百科
  • 重庆綦江网站制作公司哪家专业/佛山百度seo代理
  • 做动车哪个网站查/seo网络优化是什么意思