理解js中类相关的问题

1.JS有哪些数据类型?
答案:7种数据类型。String,Number,Boolean,Object,undefined,null,Symbol(es6)。

  • Object包括:Array,Function,RegExp,Date等
  • NaN属于Number
  • 答案出现(数组,函数,正则,日期,NaN)直接滚!!!

2.JS如何判断一个对象是否属于某个类?
答案:typeof,instanceof,constructor。不过这三种方式都有问题,可以自己写一个函数去判断,使用Object原型上的toString方法+call+slice。

【typeof】

  • 作用:检测数据类型,以小写字符串的形式返回数据类型。
  • 如何使用:typeof 对象
  • 可以检测:String,Number,Boolean,Funciton,Object,undefined(返回undefined),未赋值的变量(也返回”undefined”)
  • 不可以检测:null,Array,RegExp,Date等(返回”object”)

【instanceof】

  • 作用:判断已知对象类型正确与否,返回布尔值。
  • 如何使用:对象 instanceof 对象类型(大小写不能错)
  • 可以检测:Array,Function,new出来的基本数据类型的值【eg:new String(‘111’),new Number(111),new Boolean(true)
    弊端:只要在当前实例的原型链上,我们用其检测出来的结果都是true。比如上述所有的数据类型的值也都是Object类型。
  • 不可以检测:null,undefined,字面量方式创建的基本数据类型的值(返回false),未赋值的变量(报错)

【constructor】

  • 作用:跟instanceof类似,但是我们可以把类的原型进行重写,重写的过程中很有可能把之前的constructor覆盖了,这样检测出来的结果是不准确的。
  • 如何使用:对象.constructor == 对象类型(大小写不能错)
  • 可以检测:String,Number,Boolean,Funciton,Object
    弊端:我们可以把类的原型进行重写,重写的过程中很有可能把之前的constructor覆盖了,这样检测出来的结果是不准确的。
  • 不可以检测:null,undefined,未赋值的变量(报错)

【完美方案】

1
2
3
4
5
6
7
8
9
10
11
12
function isDateType(date, type){
var thisType = Object.prototype.toString.call(date).slice(8,-1);
if(thisType === type){
return true;
}else{
return false;
}
}
//传入两个参数,第一个是要检测的数据,第二个是要检测的数据类型。
//注意:第二个参数要加引号,并且首字母大写。
isDateType("111","String");
//true

【简单方案:jq】

1
jquery.type(date);