在 JavaScript 规范(ECMA-262 19.1.3.6)中详细解释了 Object.prototype.toString
的解析过程:
-
01.如果
this
的值为undefined
,则返回字符串"[object Undefined]"
-
02.如果
this
的值为null
,则返回字符串"[object Null]"
-
03.使用
O
表示ToObject(this)
的值 -
04.使用
isArray
表示IsArray(O)
的值 -
05.如果
isArray
不是正常值(比如抛出错误),则中断执行 -
06.如果
isArray === true
,则builtinTag = "Array"
,之后执行第 16 步 -
07.如果
O
是一个exotic
字符串对象,则builtinTag = "String"
,之后执行第 16 步 -
08.如果
O
拥有内部属性[[ParameterMap]]
,则builtinTag = "Arguments"
,跳到第 16 步 -
09.如果
O
拥有内部方法[[Call]]
,则builtinTag = "Function"
,跳到第 16 步 -
10.如果
O
拥有内部属性[[ErrorData]]
,则builtinTag = "Error"
,跳到第 16 步 -
11.如果
O
拥有内部属性[[BooleanData]]
,则builtinTag = "Boolean"
,跳到第 16 步 -
12.如果
O
拥有内部属性[[NumberData]]
,则builtinTag = "Number"
,跳到第 16 步 -
13.如果
O
拥有内部属性[[DateValue]]
,则builtinTag = "Date"
,跳到第 16 步 -
14.如果
O
拥有内部属性[[RegExpMather]]
,则builtinTag = "RegExp"
,跳到第 16 步 -
15.如果第 6 ~ 14 步都不符合,则
builtinTag = "Object"
,跳到第 16 步 -
16.使用
tag
表示Get (O, @@toStringTag)
的值 -
17.如果
tag
不是正常值,则中断执行 -
18.如果
Type(tag)
不是一个字符串,则tag = builtinTag
-
19.返回一个
"[object" + tag + "]"
形式的字符串
开发者喜欢使用该方法获取内部属性
[[Class]]
的字符串值,用于检测内建对象的类型。值得注意的是,这一方法只对内建对象有效,对宿主对象等其他类型的对象则不具有可信度。