【JS】还在⽤typeof判断对象吗?判断所有数据类型的⽅法,判断是否为对象
⾸先通⽤的判断⽅法需要完全掌握。
本⽂详细说明了对象,数组,函数的判断⽅法,可在相关场景下使⽤。
做算法题可能需要筛选有限数或NaN等特殊数字。
⽂章⽬录
通⽤判断
1. 使⽤ typeof 判断,⼀般判断基本类型
var obj ={
name:'zhangxiang'
};
function foo(){
console.log('this is a function');
}
var arr =[1,2,3];
console.log(typeof1);// number
console.log(typeof'1');//string
console.log(typeof true);//boolean
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof obj);//object
console.log(typeof foo);//function
console.log(typeof arr);//object
在⼀些复杂的场景⽐如 object 与 null, array 与 object, function 与 object 等等的类型区分, typeof 就会显得⼼有余⼒不⾜了.
2. 使⽤ instanceof 判断有原型链的数据,通常判断引⽤类型,但是需要确保原型链未改变过
var obj ={}; obj instanceof Object;//=> true;
var arr =[]; arr instanceof Array;//=> true;
var fn=function(){}; fn instanceof Function;//=> true;
null instanceof Object // false
3. 使⽤ String ⽅法, 可以获取到变量的准确的类型.
function foo(){};
String.call(1);'[object Number]'
typeof arrayString.call('1');'[object String]'
String.call(NaN);'[object Number]'
String.call(foo);'[object Function]'
String.call([1,2,3]);'[object Array]'
String.call(undefined);'[object Undefined]'
String.call(null);'[object Null]'
String.call(true);'[object Boolean]'
String 的原理是当调⽤的时候, 就取值内部的 [[Class]] 属性值, 然后拼接成 '[object ’ + [[Class]] + ‘]’ 这样的字符串并返回. 然后我们使⽤ call ⽅法来获取任何值的数据类型.
*String ⽅法看起来很好⽤,但是如果使⽤String.call(new Number(1))会得到[object Number],需要注意!
判断数字
1. 判断⼀个可能是undefined、null的值是不是NaN(只能筛查出为NaN的值,如果需要出所有有限数不能直接!Number.isNaN())
Number.isNaN() // true
// ⼀个仿isNaN⽅法
function areYouNaN(val){
if(val !== val &&typeof val ==='number'){
return"yes!"
}else{return"No.I'm not!"}
}
areYouNaN(NaN)
areYouNaN(0)
areYouNaN(false)
areYouNaN(undefined)
areYouNaN(null)
var s = new Set([NaN]);s.has(NaN) // true ----可利⽤set类型的判断规则,它使⽤的算法叫做“Same-value equality”,类似于精确相等运算符( ===),主要的区别是判断NaN等于⾃⾝,⽽精确相等运算符认为NaN不等于⾃⾝,与===的不同
2. 判断⼀个可能是undefined、null的值是不是普通数字:
Number.isFinite()// true ----- 可以判断出⼀个值是否为⾮NaN,Infinity或-Infinity的有限数, 但是会有兼容性问题,不兼容IE
*使⽤Number.isFinite(val)和Number.isNaN(val)都不⽤额外判断val是否为Number值,⾮Number类型返回false
3. 判断是否为数字类型
typeof() === 'number’// true
String.call() === '[object Number]'// true
判断对象
1. 判断是否是对象
(可以⽤typeof但没必要, 需要判断不是null和array)typeof obj === ‘object’ && obj !== null && Array.isArray(obj) === false — 狭义的对象,不为function、array或null
function ifO(obj){
var type =typeof obj;
return type ==='object'&& obj !==null&& Array.isArray(obj)===false
}
var ooo ={'1':'23'}
function a(){}
ifO(ooo)// true
ifO([])// false
ifO(a)// false
String.call(obj) === '[object Object]'
var obj = {}; obj instanceof Object;
判断数组
1. 判断是否为数组
Array.isArray() // true ---- isArray 是数组类型内置的数据类型判断函数 String.call(array) === ‘[object Array]’;
var arr = []; arr instanceof Array;
判断函数
1. 判断是否为函数
typeof fun === 'function’
String.call(fun) === ‘[object Function]’;
fun instanceof Function;
function fun(){}; fun instanceof Function;
// true
function fun(){}; String.call(fun)==='[object Function]'
// true
function fun(){};typeof fun ==='function'
// true
引⽤⽂章内容:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论