实现getType(p)方法,返回变量p的数据类型,如:string、number、date、boolean、array等

389 阅读2分钟

js的数据类型分为基本数据类型和引用数据类型

  • 基本数据类型就是值类型,都是存储一些简单的数据,它存储在栈内存中,变量赋值之后,相互独立,互不影响。如字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
  • 引用数据类型的数据是存储在堆内存中,指的是那些可能由多个值构成的对象,赋值时,复制的是对象的引用,即赋值前后,变量指向同一个指向同一个引用对象。如对象(Object)、数组(Array)、函数(Function)

字符串(String)、数字(Number)、布尔(Boolean)、未定义(Undefined)、函数(Function)
这些直接用typeof可检测类型

var str = '1234'
var bool = true
var num = 3
var undef
var fuc = function () {
  return 'yueuewiwo'
}
console.log(`字符串:${typeof str}`)
console.log(`布尔类型:${typeof bool}`)
console.log(`数字:${typeof num}`)
console.log(`Undefined:${typeof undef}`)
console.log(`函数:${typeof fuc}`)

对于像 对象(Object)、数组(Array)、对空(Null)这种类型的数据,typeof往往是检测不到的,亲测:

var nul = null
var arr = [1,2,5,6]
var obj = {  a: 'name',  b: '13'}
console.log(`nul: ${typeof nul}`)
console.log(`数组: ${typeof arr}`)
console.log(`对象:${typeof obj}`)

打印结果:
nul: object
数组: object
对象:object

所以,像Object、Array、Null这种,我们要怎么检测数据类型呢?

对象类型的检测

Array数组的监测有2种方式, Array.isArray 或者 Object.prototype.toString.call  

Array.isArray是ECMAScript 2015中新增的属性,专门用来判断要检测的值是否是数组的

var arr = [1,2,5,6]
var obj = {  a: 'name',  b: '13'}

console.log(`数组: ${Array.isArray(arr)}`)
console.log(`对象:${Array.isArray(obj)}`)
打印结果:
数组: true
对象:false

你以为这样就OK了吗?NO......在IE8及以下的浏览器上,检测是无效的,因为IE9才支持isArray属性

由于array和object都是对象类型,其构造函数在实现时,各自实现了自身的prototype.toString方法,屏蔽了原型链上Object.prototype.toString() 方法。

var arr = [1,2,5,6]
var obj = {  a: 'name',  b: '13'}

console.log(`数组 -- prototype.toString: ${Object.prototype.toString.call(arr)}`)
console.log(`对象 -- prototype.toString: ${Object.prototype.toString.call(obj)}`)

打印结果:
数组: [object Array]
对象:[object object]

getType(p) {  return Object.prototype.toString.call(p)   // returns [object type]}

每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。
var nul = null
Object.prototype.toString.call(nul)  // returns [object Null]

ps:判断是否是date类型可以用p instanceof Date  判断