typeof
不能准确的区分出来复杂数据类型
const arr = [] const obj = {} console.log(typeof arr) // 'object'
console.log(typeof obj) // 'object'
instanceof
判断左边的对象和右边的构造函数的 prototype 在不在一条原型链上,或者左边的对象.__proto__能不能找到右边.prototype
const arr = [] const obj = {} console.log(arr instanceof Object) // true //
console.log(arr.__proto__ === Array.prototype) //
console.log(Array.prototype.__proto__ === Object.prototype)
console.log(arr.__proto__.__proto__ === Object.prototype) console.log(obj
instanceof Object) // true console.log(obj.__proto__ === Object.prototype)
isArray
只能区分是不是数组 , 不是数组又是啥呢
Object.prototype.toString.call
能够准确判断出是什么数据类型
const arr = [] const obj = {} const tempNull = null const tempUndefined =
undefined const num = 1 const str = '1' const fn = function () {}
console.log(Object.prototype.toString.call(arr)) // [object Array]
console.log(Object.prototype.toString.call(obj)) // [object Object]
console.log(Object.prototype.toString.call(tempNull)) // [object Null]
console.log(Object.prototype.toString.call(tempUndefined)) // [object
Undefined] console.log(Object.prototype.toString.call(num)) // [object Number]
console.log(Object.prototype.toString.call(str)) // [object String]
console.log(Object.prototype.toString.call(fn)) // [object Function]
类似于这样的一个封装方法
function pdType(con) { const str = Object.prototype.toString.call(con) switch
(str) { case '[object Array]': return '数组' case '[object Object]': return '对象'
case '[object Undefined]': return 'undefined' case '[object Number]': return
'Number' case '[object String]': return 'String' case '[object Function]':
return 'Function' case '[object Null]': return 'null' default: return '未知' } }
const arr = [] console.log(pdType(arr))
Object.prototype.toString.call(arr)
可以理解为 调用 Object.prototype.toString 的同时用 call 来改变此方法内部的 this 指向
arr 借用 Object 原型上的 toString 方法
// 需求:往 obj 里面加一项 'c' const obj = { 0: 'a', 1: 'b', length: 2, } // obj[2] =
'c' // obj.length++ // console.log(obj) // 不能 push,因为 obj 都没有 push 方法 //
obj.push('c') // 答案:借用 // obj 借用了数组原型上的方法 push,加了一个 c
Array.prototype.push.call(obj, 'c') console.log(obj)