引言
在 ES6 之前,JavaScript 有六种数据类型:五种基本数据类型(String
、Number
、Boolean
、Null
、Undefined
)和一种复杂数据类型(Object
)。简单数据类型(如 Boolean
、Number
、String
)的转换规则已经在前面的文章中讲过,今天我们来聊聊 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
对象 - 数组
[]
和普通对象{}
会正常转换为对应的对象。
在实际操作中,null
和 undefined
转换为对象时会抛出错误,因为它们并不能被包装成对象。
小拓展:对象包装的基本概念
-
Object()
是一种包装构造函数,它可以将非对象类型的数据转化为对应的对象类型。- 原始类型(如
String
、Number
、Boolean
)会被自动装箱(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()
是对象的一个方法,用于返回对象的原始值。大多数内建对象(如Date
、Array
)都会定义该方法。toString()
是对象的另一个方法,通常用来返回对象的字符串表示。几乎所有对象都有这个方法,但其行为根据对象类型不同而有所差异。
小结:Object
类型转换规则总结
原始值 | 转换为 Boolean |
转换为 Number |
转换为 String |
---|---|---|---|
{} |
true |
NaN |
[object Object] |
[] |
true |
0 |
"" |
function() |
true |
NaN |
function() {} |
null |
false |
NaN |
null |
undefined |
false |
NaN |
undefined |
总结
对象是 JavaScript 中最重要的数据类型之一,掌握它的转换规则,不仅能帮助我们避免常见的类型转换错误,还能使代码更加清晰和高效。
求点赞和投票