JS-原理分析-toString()

wujiawen 发布于

Object.prototype.toString 实现原理

Object.prototype.toString() 用来判断对象的内置类型

使用示例:

1
Object.prototype.toString.call(obj)

由于是Object对象的原型方法,所以,所有对象都有这个方法

但是不同对象会对toString()进行不同的重写实现,所以,单独通过目标对象调用toString()是无法获取对象类型的
如:

1
2
3
let arr = [1,2,3]
Object.prototype.toString.call(arr) // [object, Array]
arr.toString() // '1,2,3'

接下来看一下 Object.prototype.toString() 会执行的操作:

规范 ECMAScript 3

  • 获取this对象的[[Class]]属性的值

  • 计算出三个字符串”[object “, 第一步的操作结果Result(1), 以及 “]”连接后的新字符串

  • 返回第二步的操作结果Result(2)

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性 在规范中,[[Class]]是这么定义的

[[Class]]属性只能通过Object.prototype.toString方法访问

规范 ECMAScript 5 会比 3 定义得更完善,但是原理是不变的

所以,平时使用时,通过call,改变this指向,可以判断不同对象的内置类型

附上各种对象的内置类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 类型:null
Object.prototype.toString.call(null) // => "[object Null]"

// 类型:undefined
Object.prototype.toString.call(undefined) // => "[object Undefined]"

// 类型:Boolean
Object.prototype.toString.call(true) // => "[object Boolean]"

// 类型:Number
Object.prototype.toString.call(1) // => "[object Number]"

// 类型:String
Object.prototype.toString.call("") // => "[object String]"

// 类型:Array
Object.prototype.toString.call([]) // => "[object Array]"

// 类型:Function
Object.prototype.toString.call(function(){}) // => "[object Function]"

// 类型:Error
Object.prototype.toString.call(new Error()) // => "[object Error]"

// 类型:RegExp
Object.prototype.toString.call(/\d+/) // => "[object RegExp]"

// 类型:Date
Object.prototype.toString.call(new Date()) // => "[object Date]"

// 类型:Object
Object.prototype.toString.call({}) // => "[object Object]"

找规律~

后面的类型都是以大写开头( ̄▽ ̄)