js 判断变量的类型 typeof Object.prototype.toString.call(a) instanceof

方法1

语法:typeof 变量xxx,返回值是,变量xxx的数据类型的字符串表达


  typeof undefined       返回  "undefined"

  typeof 5               返回  "number"

  typeof 'hello'         返回  "string"

  typeof true            返回  "boolean"

  typeof null            返回  "object"

  typeof {}              返回  "object"

  typeof []              返回  "object"

  typeof function () {}  返回  "function"

  * 需要注意的:typeof null 返回 "object",这是 JavaScript 中的一个历史遗留问题,实际上 null 的数据类型是 null* `typeof` 也可以用来判断一个变量是否已经定义,如下
	if (typeof someVariable !== 'undefined') {
	    // 变量已经定义
	} else {
		// 变量未定义
	}


方法2:

语法:Object.prototype.toString.call(变量xxx)


  let a = 123
  let b = 'asd'
  let c = [1, 2, 3, 4, 5]
  let d = function () { }
  let e = {}
  let f = undefined
  let g = null

  console.log(Object.prototype.toString.call(a)) // [object Number]
  console.log(Object.prototype.toString.call(b)) // [object String]
  console.log(Object.prototype.toString.call(c)) // [object Array]
  console.log(Object.prototype.toString.call(d)) // [object Function]
  console.log(Object.prototype.toString.call(e)) // [object Object]
  console.log(Object.prototype.toString.call(f)) // [object Undefined]
  console.log(Object.prototype.toString.call(g)) // [object Null]


  // 使用 Object.prototype.toString 来判断变量 aa 是否为数组时,可以按照以下方式进行:
  function isArray(value) {
    return Object.prototype.toString.call(value) === '[object Array]'
  }

  let aa = [1, 2, 3]
  console.log(isArray(aa)) // 输出 true

  let bb = 'hello'
  console.log(isArray(bb)) // 输出 false


原理:
      Object.prototype.toString.call 的原理涉及到 JavaScript 中的内部对象 [[Class]] 和原型链的概念,
      在 JavaScript 中,每个对象都有一个内部属性 [[Class]],它用来表示对象的类型,
      Object.prototype.toString 方法实际上返回了 [[Class]] 的值,从而可以判断对象的具体类型,

      当你调用 Object.prototype.toString 方法时,实际上是调用了内置的 toString 方法,该方法会返回一个表示对象类型的字符串。例如:
      
        对于数组,Object.prototype.toString.call([]) 返回 "[object Array]"

        对于日期对象,Object.prototype.toString.call(new Date()) 返回 "[object Date]"

        对于函数,Object.prototype.toString.call(function(){}) 返回 "[object Function]"

        对于正则表达式,Object.prototype.toString.call(/test/) 返回 "[object RegExp]"

        对于普通对象,Object.prototype.toString.call({}) 返回 "[object Object]"

      在调用 Object.prototype.toString 时,如果没有显式指定 this 的值,那么 this 默认指向当前环境中的全局对象,
      
      因此,我们通常使用 call 或者 apply 来指定要检查的对象,

      总的来说,Object.prototype.toString.call 的原理就是通过获取对象的 [[Class]] 值来判断对象的类型。


方法3


instanceof:判断对象的具体类型(因为对象包含了函数、数组)
instanceof:只能用来判断对象和函数的数据类型,不能用来判断基本数据类型(如数字、字符串、布尔值等)的数据类型


  var bbb = {
    b1: [1, 'asd', console.log],
    b2: function () {
      console.log('b2的打印呐')
    }
  }
  console.log(bbb instanceof Object) // true
  console.log(bbb.b1 instanceof Object, bbb.b1 instanceof Array) // true, true
  console.log(bbb.b2 instanceof Object, bbb.b2 instanceof Function) // true, true


  let arr = []
  let obj = {}
  console.log(arr instanceof Array) // true
  console.log(obj instanceof Object) // true

你可能感兴趣的:(javascript)