各种对象上的 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 方法。

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

  1. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  2. 在C#中,当您在null对象上调用扩展方法时会发生什么?

    本文翻译自:In C#, what happens when you call an extension method on a null object? Does the method get ca ...

  3. 绑定到对象上的copyWithin方法

    对于在数组上使用copyWithin方法应该都很熟悉,但是绑定到对象上呢? [].copyWithin.call({length: 5, 3: 1}, 0, 3) I just began to le ...

  4. String.valueOf()方法与toString()方法的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 两者都是把ObJect对象转化为String 类型. 2.string.valueof()方法 ...

  5. c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别

    针对标题的两种情况,使用起来有一定的特殊性,特此记录下. 至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章. 标题的两种情况: 情况一: 这个例子用了两个知识: 第一,关于std ...

  6. python五十七:str与repr,类似于 java对象中的tostring()方法

    class Foo:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return (&quo ...

  7. unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)

    gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的 GameObject.Destr ...

  8. Java调用tostring方法分析_Java对象toString()方法

    对象的字符串表示以可读格式包含有关对象状态的信息. Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...

  9. 由Object.prototype.toString.call( )引发关于toString( )方法的思考

    引言 前端面试中有这么一道经典的问题,如何判断一个对象是否为数组? ES5提供了一个确定对象是否为数组的函数 Array.isArray(object); 复制代码 其中,object是必须的,表示要 ...

最新文章

  1. python berkeley DB操作——打开btree索引文件中的database
  2. #include NOIP2009 Junior 细胞分裂 ——using namespace wxl;
  3. 当前安卓App加固到底该如何做到防篡改?
  4. el-table列宽设置百分比无效;el-table使用min-width设置百分比;el-table百分比设置无效;
  5. Spring Boot + JSP
  6. linux中内存挂载到目录下
  7. 学习PHP-感谢帅哥分享O(∩_∩)O~
  8. mysql操作SQL语句
  9. 关于EasyRecovery的一些高级设置
  10. 05. 区间成员函数优先于与之对应的单元素成员函数
  11. 怎么改java的gre_GRE怎样完成60天小白到大神的蜕变?
  12. QQ群聊天记录统计分析 V0.2
  13. 字节面试算法题:用集合中的数凑小于target的最大数(Java实现,各类用例均通过)
  14. Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
  15. google浏览器打包扩展程序
  16. latex参考文献中输入
  17. java开发工作地池州_安徽8个地级市,池州排第八前途不可限量
  18. 医疗卫生信息化数据防泄漏保护系统解决方案
  19. html鼠标拖尾效果,Canvas实现特效(一):粒子拖尾
  20. 区块链:对链式结构型 PoS 系统的 “虚假权益” 攻击

热门文章

  1. Is the server running on host localhost (::1) and accepting         TCP/IP connections on port 5
  2. matlab 离散阶跃函数,MATLAB编程实现简单阶跃函数波形
  3. 阶跃函数代码(基础作业
  4. pytorch scatter和scatter_详解
  5. java常用的的集中设计模式
  6. matlab数值逼近,Matlab与数值分析函数的数值逼近作业
  7. c语言ecit,[转载]c# linq的一些运用 – EcitGis – 博客园
  8. 树莓派学习笔记-人体红外线感应灯-wiringPi
  9. 再读《中国惠普前总裁孙振耀谈工作与生活》之一:健康第一
  10. ubuntu9.10 软件推荐