总结js的⼏种数据类型检测⽅法
在此总结⾃⼰常⽤的⼏种js判断数据类型的⽅法。
定义⼏个变量备⽤:
let a="string";
let b=111;
let c={};
let d=[1,2,3];
let e=function () {
console.log("eee");
}
let f = undefined;
let g = null;
let h = new Date();
let i = /test/;
let j = true;
1. typeof
console.log(typeof a);//string
console.log(typeof b);//number
console.log(typeof c);//object
console.log(typeof d);//object
console.log(typeof e);//function
console.log(typeof f);//undefined
console.log(typeof g);//object
console.log(typeof h);//object
console.log(typeof i);//object
console.log(typeof j);//boolean
1. typeof可以检测出的数据类型为:
string、
number、
function、
undefined、
boolean
2. typeof 不能判断出object中的对象、数组等⽅法。typeof null也为object
3. 此⽅法的返回值都是字符串数据类型。
console.log(typeof b=="number");//true
console.log(typeof (typeof b));//string
2. instanceof
instanceof 检测对象数据类型(js中⼀切接对象)表⽰当左侧为右侧的实例时返回true。
console.log(a instanceof String);//false
console.log(b instanceof Number);//false
console.log(c instanceof Object);//true
console.log(d instanceof Array);//true
console.log(e instanceof Function);//true
console.log(h instanceof Date);//true
console.log(i instanceof RegExp);//true
1. instanceof 表⽰当左侧为右侧的实例时返回true。所以 a 和 b 返回的是false。这是因为这⾥ a 和 b 为保存字符串和数字类
型值得变量。不是他们的实例:
let a=new String('string');
let b=new Number(111);
console.log(a instanceof String);//true
console.log(b instanceof Number);//true
这样通过new⼀个实例就为true了。
举这个例⼦只是说明instanceof的使⽤,现实中通过instanceof检测string和number类型没有太⼤意义,⼀般不使⽤。
2. 注意 instanceof 后对象类型的⼤⼩写。
3. 此⽅法常⽤⼀些数据类型的判断中:
if(d instanceof Array){//如果d为数组执⾏某⽅法
console.log(d);
}
此⽅法有个问题:d不仅为Array的实例,也为Object的实例。
console.log(c instanceof Object);//true
console.log(d instanceof Object);//true
console.log(e instanceof Object);//true
所以此⽅法常⽤在判断中,只需要判断d是否为Array数据类型即可。
3. constructor
constructor 为实例原型上的⽅法,指向他的构造函数。
console.structor===Object);//true
console.structor===Array);//true
console.structor===Function);//true
console.structor=== Date);//true
console.structor=== RegExp);//true
console.structor===Object);//true
console.structor===Object);//false
typeof arrayconsole.structor===Object);//false
console.structor=== Object);//false
console.structor=== Object);//false
cosntructor可以解决instanceof的部分问题,之所以说是部分问题是因为:
function One() {}
function Two() {}
One.prototype = new Two();//此时将One构造函数的原型指向Two构造函数的⼀个实例。
let obj = new One();
console.structor === One);//false
console.structor === Two);//true
修改obj的原型为Two的实例,这时obj的constructor为Two。
这是因为:已经将One构造函数的原型指向Two构造函数的实例。虽然obj为One构造函数的实例,但是它的原型已经为Two构造函数的实例,已经没有constructor⽅法,根据原型链会继续向上寻。到的是Two
解决办法为重新⼿动赋值⼀下obj的constructor
function One() {}
function Two() {}
One.prototype = new Two();
let obj = new One();
console.structor === One);//true
console.structor === Two);//false
4. String.call()
let a = "string";
let b = 111;
let c = {};
let d = [1, 2, 3];
let e = function () {
console.log("eee");
}
let f = undefined;
let g = null;
let h = new Date();
let i = /test/;
let j = true;
console.log(String.call(a) === '[object String]');//true console.log(String.call(b) === '[object Number]');//true console.log(String.call(c) === '[object Object]');//true console.log(String.call(d) === '[object Array]');//true console.log(String.call(e) === '[object Function]');//true console.log(String.call(f) === '[object Undefined]');//true console.log(String.call(g) === '[object Null]');//true console.log(String.call(h) === '[object Date]');//true console.log(String.call(i) === '[object RegExp]');//true console.log(String.call(c) === '[object Object]');//true console.log(String.call(d) === '[object Object]');//false console.log(Object.prototyp

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。