JS的toString方法

本文深入探讨JavaScript中的toString方法,包括Object.prototype.toString的使用技巧及如何检测不同对象类型,同时介绍了Array.prototype.toString和Number.prototype.toString等原生方法的功能与用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

toString方法

Object.prototype.toString()

方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型

var obj = { a: 1 }
obj.toString() // [object Object]

※ 利用toString检测对象类型

每个对象都能通过 Object.prototype.toString() 来检测,但是很多的原生对象的toString都是改写过的,所以我们就需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数 thisArg

// 原生对象
Object.prototype.toString.call(new Object) // [object Object]
Object.prototype.toString.call(new String) // [object String]
Object.prototype.toString.call(new Date); // [object Date]
Object.prototype.toString.call(Math); // [object Math]
// ...
// 所有的原生对象都可以检测
// undefined null
Object.prototype.toString.call(undefined); // '[object Undefined]'
Object.prototype.toString.call(null); // '[object Null]'
// 自定义类
class A {}
Object.prototype.toString.call(new A) // '[object Object]'

那么问题来了,为什么原生js的类可以打印出对应的对象类型,我自己的类就是普普通通的Object呢?
然后去查了下文档

  • null和undefined
    在这里插入图片描述
  • 其他的对象
    在这里插入图片描述
    然后我为大家翻译了一下(不是我看不懂哈
    当调用 toString 方法时,会执行以下步骤:
    1.获取该对象的[[Class]]属性。
    2.调用 ToString(Result(1))。
    3.通过连接三个字符串“[object”、Result(2) 和“]”来计算字符串值。
    4.返回结果(3)。

于是乎我们就找到问题的关键[[Class]],但~~~是console.dir一下发现没有。。。。
幸好机智的发现了Math里面有一个Symbol(Symbol.toStringTag): "Math"
然后我就尝试了一下

class A {
  get [Symbol.toStringTag] () {
    return 'Ahaha'
  }
}
console.log(Object.prototype.toString.call(new A)) // '[object Ahaha]'

在这里插入图片描述
截图为证

我们也可以自定义对象的toString,这个这里就不谈了
还几个js自己改写了的也简单说一下吧

Array.prototype.toString()

返回一个字符串,表示指定的数组及其元素。

const arr = [1, 2, 3]
arr.toString() // '1,2,3'
// 特殊情况
[1, {a : 2}].toString() // '1,[object Object]'
// ...其他的类型调各自的toString

Number.prototype.toString()

返回指定 Number 对象的字符串表示形式。

  • 语法
    numObj.toString([radix])
    radix指定要用于数字到字符串的转换的进制(从2到36)。如果未指定 radix 参数,则默认值为 10。如果参数不在2到36内,会报错。负数会保留-
// copy的mdn上的懒得写了
var count = 10;

console.log(count.toString());    // 输出 '10'
console.log((17).toString());     // 输出 '17'
console.log((17.2).toString());   // 输出 '17.2'

var x = 6;

console.log(x.toString(2));       // 输出 '110'
console.log((254).toString(16));  // 输出 'fe'

console.log((-10).toString(2));   // 输出 '-1010'
console.log((-0xff).toString(2)); // 输出 '-11111111'

Function.prototype.toString()

返回一个表示当前函数源代码的字符串。
!!!!打印函数体用处还是挺大的,我有一个大胆的想法

console.log(Object.prototype.toString.toString())
// 结果, function toString() { [native code] }
// 果然是我想多了

至于这个[native code],简单的搜索了一下,大概意思就是原生函数体不会给我们看,原生的方法调用toString方法时V8引擎是以function + Name + () { [native code] }的格式返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值