当前位置:首页 > 技术 > 正文内容

JavaScript 变量类型与类型转换详解

访客 技术 2026年6月15日 1

变量存储方式分类 在 JavaScript 中,变量根据数据存储机制分为两类:基本类型(值类型)引用类型

  • 基本类型 包括:booleannullundefinednumberstring 以及 Symbol(用于创建唯一标识符)。
  • 引用类型 包括:ObjectArrayFunction

使用 typeof 检测类型 typeof 操作符可识别以下类型:

  • undefined
  • string
  • boolean
  • number
  • object
  • function
console.log(typeof undefined);        // "undefined"
console.log(typeof 'hello');          // "string"
console.log(typeof true);             // "boolean"
console.log(typeof 42);               // "number"
console.log(typeof {});               // "object"
console.log(typeof []);               // "object"
console.log(typeof null);             // "object" (历史遗留问题,表示空对象引用)
console.log(typeof function(){});     // "function"

⚠️ 注意:typeof null 返回 "object" 是语言设计的缺陷,实际应为 null 类型。

通过 instanceof 判断引用类型 对于复杂类型,建议使用 instanceof 进行判断:

console.log({} instanceof Object);    // true
console.log([] instanceof Array);     // true

值类型与引用类型核心差异

特性 值类型 引用类型
存储位置 栈内存 堆内存,栈中仅存地址
内存生命周期 函数执行完毕即释放 只要存在引用,就不会被回收
复制行为 复制原始值 复制引用地址,共享同一对象
类型检测方式 typeof instanceof

显式类型转换

  1. 转换为数字:Number()
  • 原始值:

  • 数字 → 不变

  • 字符串:可解析则转为数值,否则为 NaN;空字符串转为 0

  • 布尔值:true1false0

  • undefinedNaN

  • null0

  • 对象:

  1. 先调用 valueOf(),若返回原始值则转换;
  2. 否则调用 toString(),若返回原始值则转换;
  3. 若两者均返回复合类型,则抛出错误。
Number('123')       // 123
Number('abc')       // NaN
Number(true)        // 1
Number(null)        // 0
  1. 转换为字符串:String()
  • 原始值:

  • 数字 → 字符串形式

  • 字符串 → 不变

  • 布尔值 → 'true'/'false'

  • undefined'undefined'

  • null'null'

  • 对象:

  1. 优先调用 toString(),若返回原始值则使用;
  2. 否则调用 valueOf(),若返回原始值则使用;
  3. 两者都返回复合类型时抛错。
String(123)         // "123"
String(true)        // "true"
String(null)        // "null"
  1. 转换为布尔值:Boolean() 仅当值为以下情况时为 false
  • undefined
  • null
  • +0, -0
  • NaN
  • 空字符串 ''

其余所有值均转为 true

Boolean('')         // false
Boolean('abc')      // true
Boolean(0)          // false

隐式类型转换场景

  1. 算术运算
100 + '10'   // "10010"(字符串拼接)
100 - '10'   // 90(自动转为数字)
100 * '5'    // 500
100 / '2'    // 50
  1. 条件判断
if (100) { /* true */ }           // 非零数转为 true
if ('') { /* false */ }           // 空字符串转为 false
  1. 控制台输出与弹窗 console.log()alert() 会自动将参数转为字符串显示。

  2. 相等比较操作符 == 执行类型强制转换,例如:

123 == '123'       // true
0 == ''            // true
null == undefined  // true
  1. 逻辑运算符
10 && 0            // 0(短路求值,10 转为 true)
'' || 'hello'      // 'hello'
!window.data       // true(若 data 未定义)

何时使用 === 与 ==

  • 推荐始终使用 ===:避免意外类型转换,性能更优,代码更清晰。

  • 特殊情况使用 ==

  1. 检查属性是否存在(常见于库函数写法):
if (obj.prop == null) {
  // 等价于 obj.prop === null || obj.prop === undefined
}
  1. 函数参数是否缺失:
function process(value) {
  if (value == null) {
    // 表示参数未传或为 null/undefined
  }
}

JavaScript 内置构造函数(纯语言层面)

  • Object
  • Array
  • Boolean
  • Number
  • String
  • Function
  • Date
  • RegExp
  • Error

关于 JSON 的理解 JSON 是一种轻量级的数据交换格式,广泛用于前后端通信。它本质上是符合特定规则的 JavaScript 对象结构。

常用方法:

  • JSON.stringify(obj):将对象序列化为字符串。
  • JSON.parse(str):将字符串解析为对象。
const data = { name: 'Alice', age: 25 };
const jsonStr = JSON.stringify(data);
const parsed = JSON.parse(jsonStr);

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。