各种对象上的 toString 方法的区别和关联
各种对象上的 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
方法外,Date
、Array
、Number
、String
、Boolean
、Function
、Error
这些对象上面的原型对象上实际上也都存在自己的 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
方法可以分为三类,一类是像 Date
、Array
、Number
、String
、Boolean
、Function
、Error
、URL
、URLSearchParams
、RegExp
、Symbol
这些对象上重写了 toString
方法,都有自己独特的用处,另一类是像 null
、undefined
这样的数据类型是没有 toString
方法的,最后一类则是除上之外其它的对象都是调用的原型链上的 Object.prototype.toString
方法。
各种对象上的 toString 方法的区别和关联相关推荐
- java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...
- 在C#中,当您在null对象上调用扩展方法时会发生什么?
本文翻译自:In C#, what happens when you call an extension method on a null object? Does the method get ca ...
- 绑定到对象上的copyWithin方法
对于在数组上使用copyWithin方法应该都很熟悉,但是绑定到对象上呢? [].copyWithin.call({length: 5, 3: 1}, 0, 3) I just began to le ...
- String.valueOf()方法与toString()方法的区别
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 两者都是把ObJect对象转化为String 类型. 2.string.valueof()方法 ...
- c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别
针对标题的两种情况,使用起来有一定的特殊性,特此记录下. 至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章. 标题的两种情况: 情况一: 这个例子用了两个知识: 第一,关于std ...
- python五十七:str与repr,类似于 java对象中的tostring()方法
class Foo:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return (&quo ...
- unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)
gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的 GameObject.Destr ...
- Java调用tostring方法分析_Java对象toString()方法
对象的字符串表示以可读格式包含有关对象状态的信息. Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...
- 由Object.prototype.toString.call( )引发关于toString( )方法的思考
引言 前端面试中有这么一道经典的问题,如何判断一个对象是否为数组? ES5提供了一个确定对象是否为数组的函数 Array.isArray(object); 复制代码 其中,object是必须的,表示要 ...
最新文章
- python berkeley DB操作——打开btree索引文件中的database
- #include NOIP2009 Junior 细胞分裂 ——using namespace wxl;
- 当前安卓App加固到底该如何做到防篡改?
- el-table列宽设置百分比无效;el-table使用min-width设置百分比;el-table百分比设置无效;
- Spring Boot + JSP
- linux中内存挂载到目录下
- 学习PHP-感谢帅哥分享O(∩_∩)O~
- mysql操作SQL语句
- 关于EasyRecovery的一些高级设置
- 05. 区间成员函数优先于与之对应的单元素成员函数
- 怎么改java的gre_GRE怎样完成60天小白到大神的蜕变?
- QQ群聊天记录统计分析 V0.2
- 字节面试算法题:用集合中的数凑小于target的最大数(Java实现,各类用例均通过)
- Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
- google浏览器打包扩展程序
- latex参考文献中输入
- java开发工作地池州_安徽8个地级市,池州排第八前途不可限量
- 医疗卫生信息化数据防泄漏保护系统解决方案
- html鼠标拖尾效果,Canvas实现特效(一):粒子拖尾
- 区块链:对链式结构型 PoS 系统的 “虚假权益” 攻击
热门文章
- Is the server running on host localhost (::1) and accepting TCP/IP connections on port 5
- matlab 离散阶跃函数,MATLAB编程实现简单阶跃函数波形
- 阶跃函数代码(基础作业
- pytorch scatter和scatter_详解
- java常用的的集中设计模式
- matlab数值逼近,Matlab与数值分析函数的数值逼近作业
- c语言ecit,[转载]c# linq的一些运用 – EcitGis – 博客园
- 树莓派学习笔记-人体红外线感应灯-wiringPi
- 再读《中国惠普前总裁孙振耀谈工作与生活》之一:健康第一
- ubuntu9.10 软件推荐