原型链概念:
js中的对象都继承自Object,在某个对象上调用一个方法时,会先在该对象上进行查找,如果没找到则会进入对象的原型(也就是.prototype)进行查找,如果没找到,同样的也会进入对象原型的原型进行查找,直到找到或者进入原型链的顶端Object.prototype才会停止。
数组的toString()方法和Object的toString()方法:
Object.toString === Array.toString //true
Object.prototype.toString === Array.toString //false
Object.prototype.toString === Array.prototype.toString //false
Object.prototype.toString方法可以判断所有数据类型
Array.prototype.toString不能判断:
(Proxy Promise symbol() undefined null 不传值 自执行函数)
同时判断数组 [],new Array,new Array() 会变成 ''
Array.prototype.toString.call([]) // ''
Object.prototype.toString为什么要加.call():
let arr = [1,2,3,4,5]
Object.prototype.toString(arr) // '[object Object]'
Object.prototype.toString.call(arr) // '[object Array]'
因为.call的作用是重写this指针的指向
通过call指定arr数组为Object.prototype对象中的toString方法的上下文
this指向的是arr 类型是Array
如果不加.call()的话,this指向为Object,Object的数据类型自然是Object
使用Object.prototype.toString方法判断所有数据类型:
Object.prototype.toString.call({}).slice(8,-1)
// 'Object'
Object.prototype.toString.call([]).slice(8,-1)
// 'Array'
Object.prototype.toString.call(()=>{}).slice(8,-1)
// 'Function'
Object.prototype.toString.call(function(){}).slice(8,-1)
// 'Function'
Object.prototype.toString.call('').slice(8,-1)
// 'String'
Object.prototype.toString.call(true).slice(8,-1)
// 'Boolean'
Object.prototype.toString.call(1).slice(8,-1)
// 'Number'
Object.prototype.toString.call(Infinity).slice(8,-1)
// 'Number'
Object.prototype.toString.call(NaN).slice(8,-1)
// 'Number'
Object.prototype.toString.call(undefined).slice(8,-1)
// 'Undefined'
Object.prototype.toString.call().slice(8,-1)
// 'Undefined'
Object.prototype.toString.call((function(){})()).slice(8,-1)
// 'Undefined'
Object.prototype.toString.call(null).slice(8,-1)
// 'Null'
Object.prototype.toString.call(new RegExp()).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(new RegExp).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(/a-Z/igm).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(symbol()).slice(8,-1)
// 'Symbol'
Object.prototype.toString.call(new Map()).slice(8,-1)
// 'Map'
Object.prototype.toString.call(new Set()).slice(8,-1)
// 'Set'
Object.prototype.toString.call(new Map).slice(8,-1)
// 'Map'
Object.prototype.toString.call(new Set).slice(8,-1)
// 'Set'
Object.prototype.toString.call(Math).slice(8,-1)
// 'Math'
Object.prototype.toString.call(new Date()).slice(8,-1)
// 'Date'
--**-- 以下皆是js 中的 构造函数
Object.prototype.toString.call(Function).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Object).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Array).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Number).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Boolean).slice(8,-1)
// 'Function'
Object.prototype.toString.call(String).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Date).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Promise).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Proxy).slice(8,-1)
// 'Function'
Object.prototype.toString.call(RegExp).slice(8,-1)
// 'Function'