内置类型辨析
今天看了一同事写的代码,又长见识了,今天学习到如何靠谱地知道对象值的内置类型。
方法是:Object.prototype.toString.call( );
Object.prototype.toString.call('') --> [Object String]
Object.prototype.toString.call([]) --> [Object Array]
Object.prototype.toString.call({}) --> [Object Object]
Object.prototype.toString.call(Function) --> [Object Function]
Object.prototype.toString.call(Math) --> [Object Math]
Object.prototype.toString.call(JSON) --> [Object JSON]
Object.prototype.toString.call(true) --> [Object Boolean]
Object.prototype.toString.call(new Date()) --> [Object Date]
Object.prototype.toString.call(new RegExp()) --> [Object RegExp]
Object.prototype.toString.call(new Error()) --> [Object Error]
Object.prototype.toString.call(2) --> [Object Number]
在ES3中,Object.prototype.toString方法的规范如下:
- 15.2.4.2 Object.prototype.toString()
在toString方法被调用时,会执行下面的操作步骤:
1. 获取this对象的[[Class]]属性的值.
2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.
3. 返回第二步的操作结果Result(2).
在ES5.1中,除了规范写的更详细一些以外,Object.prototype.toString方法和[[class]]内部属性的定义上也有一些变化,Object.prototype.toString方法的规范如下:
15.2.4.2 Object.prototype.toString ( )
在toString方法被调用时,会执行下面的操作步骤:
- 如果this的值为undefined,则返回
"[object Undefined]"
.- 如果this的值为null,则返回
"[object Null]"
.- 让O成为调用ToObject(this)的结果.
- 让class成为O的内部属性[[Class]]的值.
- 返回三个字符串"[object ", class, 以及 "]"连接后的新字符串
.
ES3原生对象的[[class]]内部属性的值一共有10种.分别是:"Array"
, "Boolean"
, "Date"
, "Error"
, "Function"
,
"Math"
,"Number"
, "Object"
, "RegExp"
, "String".
ES5和ES3对比,第一个差别就是[[class]]内部属性的值多了两种,成了12种,一种是arguments对象的[[class]]成了"Arguments",而不是以前的"Object",还有就是多个了全局对象JSON,它的[[class]]值为"JSON".
所以目前应该有12种: "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"