面试题——(三)数据类型判断

数据类型有哪些?

①.typeof
typeof 对于基本数据类型判断是没有问题的。
当变量是:number, string, boolean, function, undefined, object类型时,可以使用typeof进行判断。当变量是arr, json, null, date, reg, error 类型时全部被错误的检测为object类型。

②.instanceof
判断 new 关键字创建的引用数据类型
不考虑 null 和 undefined(这两个比较特殊)以对象字面量创建的基本数据类型

//基本数据类型
console.log("1" instanceof String); //false
console.log(1 instanceof Number);  //false
console.log(true instanceof Boolean);  //false
//引用数据类型
console.log([] instanceof Array);  //true
console.log(function(){} instanceof Function);  //true
console.log({} instanceof Object);  //true

③.constructor
constructor 除了undefined 和 null ,其他变量都能使用constructor 判断类型。

console.log(("1").constructor === String);  //true
console.log((1).constructor === Number);  //true
console.log((true).constructor === Boolean);  //true
console.log(([]).constructor === Array);  //true
console.log((function(){}).constructor === Function);  //true
console.log(({}).constructor === Object);  //true
console.log((null).constructor === Null);   //报错
console.log((undefined).constructor === Undefined);  //报错

似乎完全可以应对基本数据类型和引用数据类型 但如果声明了一个构造函数,并且把他的原型指向了 Array 的原型

function Fn(){};
Fn.prototype=new Array(); 
var f=new Fn();
console.log(f.constructor===Fn);  //false
console.log(f.constructor===Array);  //true

原因
1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

④.Object.prototype.toString.call() 完美的解决方案

console.log(Object.prototype.toString.call(1));  //[object Number]
console.log(Object.prototype.toString.call("1"));  //[object String]
console.log(Object.prototype.toString.call(true));  //[object Boolean]
console.log(Object.prototype.toString.call([]));  //[object Array]
console.log(Object.prototype.toString.call(function(){})); //[object Function]
console.log(Object.prototype.toString.call({}));  //[object Object]
console.log(Object.prototype.toString.call(null));  //[object Null]
console.log(Object.prototype.toString.call(undefined));  //[object Undefined]

⑤ jquery中的$.type()

可参考:https://juejin.im/post/6844903990962946056#heading-0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值