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)