一次搞懂 JS 对象转换,从此告别类型错误!

引言

在 ES6 之前,JavaScript 有六种数据类型:五种基本数据类型(StringNumberBooleanNullUndefined)和一种复杂数据类型(Object)。简单数据类型(如 BooleanNumberString)的转换规则已经在前面的文章中讲过,今天我们来聊聊 Object 类型的转换。

Object() 的显式类型转换

Object() 是一个将其他数据类型转换为 Object 的构造函数。它是 JavaScript 中将其他类型包装成对象的主要方式。我们来看看如何通过 Object() 转换不同的数据类型。

javascript 复制代码
console.log("123", Object(123));         // Number
console.log("true", Object(true));       // Boolean
console.log("null", Object(null));       // Null
console.log("undefined", Object(undefined));  // Undefined
console.log("''", Object(""));          // String
console.log("[]", Object([]));          // Array
console.log("{} ", Object({}));         // Object

输出结果:

  • 123 转换为 Number 对象
  • true 转换为 Boolean 对象
  • null 转换为 Object,但是会抛出 TypeError
  • undefined 转换为 Object,同样会抛出 TypeError
  • 空字符串 "" 转换为 String 对象
  • 数组 [] 和普通对象 {} 会正常转换为对应的对象。

在实际操作中,nullundefined 转换为对象时会抛出错误,因为它们并不能被包装成对象。

小拓展:对象包装的基本概念
  • Object() 是一种包装构造函数,它可以将非对象类型的数据转化为对应的对象类型。

    • 原始类型(如 StringNumberBoolean)会被自动装箱(auto-boxing)成相应的对象。
    • 在转换时会创建一个临时的包装对象,使得原始数据可以作为对象使用。

Object 类型的显式转换规则

1. 转换为 Boolean

在 JavaScript 中,所有对象(包括数组、函数、日期等)在转换为布尔值时都会被视为 true

javascript 复制代码
console.log("{}", Boolean({}));           // true
console.log("[]", Boolean([]));           // true
console.log("function()", Boolean(function() {})); // true
console.log("new Date()", Boolean(new Date())); // true

总结: 所有对象(包括空对象、空数组、空函数等)转换为布尔值时,都为 true

2. 转换为 Number

当对象被转换为数字时,会调用该对象的 valueOf() 方法。如果该方法返回一个原始值(如数字),则直接返回该值。如果返回一个对象,JavaScript 会尝试使用 toString() 方法将其转换为字符串,再进一步转换为数字。

javascript 复制代码
console.log("{}", Number({}));           // NaN
console.log("[]", Number([]));           // 0
console.log("['1']", Number(['1']));     // 1
console.log("[1, 2, 3]", Number([1, 2, 3])); // NaN

总结:

  • 空对象 {} 转换为 NaN
  • 空数组 [] 转换为 0,这是因为空数组的 valueOf() 方法返回的是原始值 [],而 toString() 会返回空字符串,空字符串转换为数字就是 0
  • 包含数字的数组会根据数组的内容转换为对应的数字。
3. 转换为 String

当对象被转换为字符串时,JavaScript 会调用该对象的 toString() 方法。对于 Object 类型的对象,它通常返回一个字符串 "[object Object]",但是对于其他类型的对象(如数组、函数等),它们的 toString() 方法的返回值会有所不同。

javascript 复制代码
console.log("{}", String({}));           // [object Object]
console.log("[]", String([]));           // ''
console.log("['1']", String(['1']));     // 1
console.log("function()", String(function() {})); // function() {}

总结:

  • 普通对象 {} 转换为字符串时,返回 "[object Object]"
  • 空数组 [] 转换为 ""(空字符串)。
  • 包含字符串的数组(如 ['1'])会转换为 1,这与数组的 toString() 方法的实现有关。
  • 函数会被转换为其源代码字符串表示。

小拓展:valueOf()toString()

  • valueOf() 是对象的一个方法,用于返回对象的原始值。大多数内建对象(如 DateArray)都会定义该方法。
  • toString() 是对象的另一个方法,通常用来返回对象的字符串表示。几乎所有对象都有这个方法,但其行为根据对象类型不同而有所差异。

小结:Object 类型转换规则总结

原始值 转换为 Boolean 转换为 Number 转换为 String
{} true NaN [object Object]
[] true 0 ""
function() true NaN function() {}
null false NaN null
undefined false NaN undefined

总结

对象是 JavaScript 中最重要的数据类型之一,掌握它的转换规则,不仅能帮助我们避免常见的类型转换错误,还能使代码更加清晰和高效。

求点赞和投票

activity.juejin.cn/rank/2024/w...

相关推荐
JAVA面经实录9171 分钟前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
小程故事多_802 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
cn_mengbei5 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen5 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
Data_Journal5 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库
掌心向暖RPA自动化5 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
竹林8186 小时前
wagmi v2 多链钱包切换:一个 Uniswap 仿盘项目让我踩了三天坑
前端·javascript
你也向往长安城吗6 小时前
最快的 JavaScript navmesh pathfinding3d 算法。
javascript
滕青山6 小时前
在线PDF拆分工具核心JS实现
前端·javascript·vue.js
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试