各种对象上的 toString 方法的区别和关联

本文探讨JavaScript中各种对象上toString方法的区别和关联,包括Date、Array、Number、String、Boolean、Function、Error等的特定实现。通过示例说明它们如何返回不同类型的字符串表示,并指出Symbol和某些特殊对象的toString行为。
摘要由CSDN通过智能技术生成

各种对象上的 toString 方法的区别和关联

问:请简述一下用于判断数据类型都有哪些方法?

答:巴拉巴拉……小魔仙

在判断数据类型的时候,有一种方式可以清晰直接地区分出所有的数据类型,即 Object.prototype.toString.call(),这方法的核心就是利用了 Object 的原型对象上的 toString 方法,这个方法会返回一个表示对象的字符串,返回的格式是 [object type],其中的 type 指代的是具体的数据类型,如下示例代码所示:

Object.prototype.toString.call({})  // "[object Object]"
Object.prototype.toString.call([])  // "[object Array]"
Object.prototype.toString.call(null)  // "[object Null]"
Object.prototype.toString.call(undefined)  // "[object Undefined]"
Object.prototype.toString.call('')  // "[object String]"
Object.prototype.toString.call(0)  // "[object Number]"
Object.prototype.toString.call(true)  // "[object Boolean]"
Object.prototype.toString.call(new Date())  // "[object Date]"
Object.prototype.toString.call(new Error())  // "[object Error]"
Object.prototype.toString.call(() => {})  // "[object Function]"
Object.prototype.toString.call(Symbol('s'))  // "[object Symbol]"
Object.prototype.toString.call(new Promise((resolved) => {resolved()}))  // "[object Promise]"
Object.prototype.toString.call(new Set([1, 2]))  // "[object Set]"
Object.prototype.toString.call(new Map([['a', 1]]))  // "[object Map]"
Object.prototype.toString.call(new ArrayBuffer())  // "[object ArrayBuffer]"
Object.prototype.toString.call(/1/)  // "[object RegExp]"

class C {}
Object.prototype.toString.call(C) // "[object Function]"
Object.prototype.toString.call(new C()) // "[object Object]"

除了 Object.prototype 上有 toString 方法外,DateArrayNumberStringBooleanFunctionError 这些对象上面的原型对象上实际上也都存在自己的 toString 方法,而这些自有的方法的作用却不一而同,如下:

  • Date.prototype.toString() 方法返回一个表示指定日期对象的字符串。

    new Date().toString()  // "Tue Mar 08 2022 16:05:08 GMT+0800 (中国标准时间)"
    
  • Array.prototype.toString() 方法返回一个表示指定数组及其元素的字符串。作用等同于使用不传参的 join 方法,但这两个方法都不能对包含 Symbol 类型的值的数据进行转换

    [1, '2', true, undefined, null, {}, [], () => 1].toString()  // "1,2,true,,,[object Object],,() => 1"
    [1, '2', true, undefined, null, {}, [], () => 1].join()  // "1,2,true,,,[object Object],,() => 1"
    [1, '2', true, undefined, null, {}, [], () => 1, Symbol('1')].toString()  // Uncaught TypeError: Cannot convert a Symbol value to a string
    // 需要注意的是,如果子项是数组,无论是一层还是多层,都会被展开,如:
    [1, [2, [3, [4]]]].toString() // "1,2,3,4"
    
  • Number.prototype.toString(radix) 方法返回一个表示指定数字对象的字符串,入参 radix 表示范围从2到36的整数,指定用于表示数值的基数

    (1).toString()  // "1"
    (-1.2222).toString()  // "-1.2222"
    (Infinity).toString()  // "Infinity"
    (6).toString(2)  // "110"
    
  • String.prototype.toString() 方法返回一个表示指定对象的字符串。

    'str'.toString()  // "str"
    
  • Boolean.prototype.toString() 方法返回一个表示指定布尔对象的字符串。

    (true).toString()  // "true"
    (false).toString()  // "false"
    
  • Function.prototype.toString() 方法返回一个表示方法源码的字符串。更多详细的对比实际源码和 toString 转换结果的示例详见 MDN Examples

    (() => {}).toString()  // "() => {}"
    (function func() {}).toString()  // "function func() {}"
    
  • Error.prototype.toString() 方法返回一个表示指定异常对象的字符串。

    new Error('error').toString()  // "Error: error"
    

此外,还有 URL.toString()URLSearchParams.toString()RegExp.prototype.toString()Symbol.prototype.toString() 这四个方法分别有自己的实现,这里就不一一写明了,可以点击链接查看 MDN 介绍。

由上,关于 toString 方法可以分为三类,一类是像 DateArrayNumberStringBooleanFunctionErrorURLURLSearchParamsRegExpSymbol 这些对象上重写了 toString 方法,都有自己独特的用处,另一类是像 nullundefined 这样的数据类型是没有 toString 方法的,最后一类则是除上之外其它的对象都是调用的原型链上的 Object.prototype.toString 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值