:D以下截图是我做的一些小实验
理解js中类相关的问题
Posted on
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
12function 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);