toString
Object.prototype.toString.call()
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call(() => {}) // '[object Function]'
Object.prototype.toString.call('seymoe') // '[object String]'
Object.prototype.toString.call(1) // '[object Number]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(Symbol()) // '[object Symbol]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call(Math) // '[object Math]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new WeakSet()) // '[object WeakSet]'
Object.prototype.toString.call(new Map()) // '[object Map]'
Object.prototype.toString.call(new WeakMap()) // '[object WeakMap]'
Object 上的 toString()方法,它的作用是返回当前方法执行的主体(方法中的 this )所属类的详细信息即 “[object Object]”, 其中第一个 object 代表当前实例是对象数据类型的(这个是固定死的,不会改变),第二个 Object 代表的是 this 所属的类是 Object。
原理
在 toString 方法被调用时,会执行下面的操作步骤:
- 如果 this 未定义时,返回“[object Undefined]”
- 如果 this 为 null 时,返回“[object Null]”
- 定义 O,并且让 O=ToObject(this)
- 获取 this 对象的 Class 属性的值.
- 计算出三个字符串”[object ”, 第一步的操作结果 Result(1), 以及 ”]“连接后的新字符串.
- 返回第二步的操作结果 Result(2).
Class 是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中, Class 是这么定义的:一个字符串值,表明了该对象的类型.
可以清晰的得出 toString()是在以特殊的字符串形式输出 this 的类型,不管你传入什么参数,该方法都是执行了 window.toString() 方法,this 一直指向了 window 对象,
所以在判断类型时也可以直接使用 toString.call(arr)
isArray
ES6 的 isArray 也是通过 toString 实现的
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}封装函数
var type = function(data) {
var toString = Object.prototype.toString;
var dataType = toString
.call(data)
.replace(/\[object\s(.+)\]/, "$1")
.toLowerCase()
return dataType
};