如何判断数据类型 , 最好的方法是什么

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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值