Object.prototype.toString
在JS 中,想要判断内置类型,最靠谱的方法,就是通过 Object.prototype.toString
var arr = [];
console.log(Object.prototype.toString.call(arr)) //"[object Array]"
ES3 tostring 方法规范
执行步骤
1. 获取 this 对象的[[class]]属性的值
2. 计算出三个字符串”[object “, 第一步的操作结果Result(1), 以及 “]”连接后的新字符串
3. 返回第二部的操作结果
注:[[Class]] 是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性
注:ES3中的[[Class]]原生属性值一共有10种:”Array”, “Boolean”, “Date”, “Error”, “Function”, “Math”, “Number”, “Object”, “RegExp”, “String”
[[Class]] 定义:
内部属性 | 描述 |
---|---|
[[Class]] | 一个字符串值,表明了该对象的类型 |
[[Class]] 解释:
所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值(查看 15.2.4.2).
ES 5.1 tostring 方法
执行步骤
1. 如果 this 的值为 undefined,则返回 “[object Undefined]”
2. 如果 this 的值为 null,则返回 “[object Null]”.
3. 让 O 成为 ToObject(this)的结果
4. 让 class 成为 O 的内部属性[[Class]]的值
5. 返回三个字符串”[object “, class, 以及 “]”连接后的新字符串
注:ES5.1 [[Class]]内部属性值多了两种, arguments对象的[[class]]成了”Arguments”,JSON的[[Class]]的值为”JSON”
ES6 规范
[[Class]]内部属性去掉,取而代之的是 [[NativeBrand]]
[[NativeBrand]] 定义:
内部属性 | 属性值 | 描述 |
---|---|---|
[[NativeBrand]] | 枚举 NativeBrand 的一个成员 | 该属性的值对应一个标志(tag value),可以用来区分原生对象的类型 |
[[NativeBrand]] 解释:
[[NativeBrand]]内部属性用来识别某个原生对象是否为符合本规范的某一种特定类型的对象.[[NativeBrand]]内部属性的值为下面这些枚举类型的值中的一个:NativeFunction, NativeArray, StringWrapper, BooleanWrapper, NumberWrapper, NativeMath, NativeDate, NativeRegExp, NativeError, NativeJSON, NativeArguments, NativePrivateName.[[NativeBrand]]内部属性仅用来区分区分特定类型的ECMAScript原生对象.只有在表10中明确指出的对象类型才有[[NativeBrand]]内部属性.
操作步骤
1. 如果this的值为undefined,则返回”[object Undefined]”.
2. 如果this的值为null,则返回”[object Null]”.
3. 让O成为调用ToObject(this)的结果.
4. 如果O有[[NativeBrand]]内部属性,让tag成为表29中对应的值.
5. 否则
1. 让hasTag成为调用O的[[HasProperty]]内部方法后的结果,参数为@@toStringTag.
2. 如果hasTag为false,则让tag为”Object”.
3. 否则,
1. 让tag成为调用O的[[Get]]内部方法后的结果,参数为@@toStringTag.
2. 如果tag是一个abrupt completion,则让tag成为NormalCompletion(“???”).
3. 让tag成为tag.[[value]].
4. 如果Type(tag)不是字符串,则让tag成为”???”.
5. 如果tag的值为”Arguments”, “Array”, “Boolean”, “Date”, “Error”, “Function”, “JSON”, “Math”, “Number”, “Object”, “RegExp”,或者”String”中的任一个,则让tag成为字符串”~”和tag当前的值连接后的结果.
6. 返回三个字符串”[object “, tag, and “]”连接后的新字符串.