typeof和instanceof区别以及缺陷,以及解决⽅案
这两个⽅法都可以⽤来判断变量类型
区别:前者是判断这个变量是什么类型,后者是判断这个变量是不是某种类型,返回的是布尔值
(1)typeof
typeof返回⼀个数据类型的字符串,⽽且都是⼩写的字符串,返回值有'number','boolean','string','function','object','undefined'这⼏个
typeof100; //'number'
typeof(1==1); //'boolean'
typeof'onepixel'; //'string'
typeof{} ; //'object'
typeof onepixel; // 'undefined'
typeof parseInt; // 'function'
typeof[];//'object'
typeof new Date(); //'object'
缺陷:
1.不能判断变量具体的数据类型⽐如数组、正则、⽇期、对象,因为都会返回object,不过可以判断function,如果检测对象是正则表达式的时
在Safari和Chrome中使⽤typeof的时候会错误的返回"function",其他的浏览器返回的是object.
候,在Safari和Chrome中使⽤typeof的时候会错误的返回"function",
2.判断null的时候返回的是⼀个object,这是js的⼀个缺陷,判断NaN的时候返回是number
(2)instanceof
可以⽤来检测这个变量是否为某种类型,返回的是布尔值,并且可以判断这个变量是否为某个函数的实例,它检测的是对象的原型
[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true
function Person(){};
[] instanceof Object; //true
new Date() instanceof Object;//tru
new Person instanceof Object;//true
var array = new Array()
array instanceof Array //true
共同点:基本数据类型都可以判断
不同点:instanceof可以判断这个变量是否为某个函数的实例,⽽typeof不能
⽤法:typeof经常⽤来检测⼀个变量是不是最基本的数据类型,instanceof简单说就是判断⼀个引⽤类型的变量具体是不是某种类型的对象。
联系:typeof和instanceof的⽬的都是检测变量的类型,两个区别在于typeof只能⽤于检测基本数据类型,instanceof可以检测基本数据类型,也可以检测某些引⽤数据类型,因为instanceof只能通过true或者false来判断,不能直接看出来是什么类型,所以需要另外⼀种直观的⽅法:
解决⽅案
因为js中的⼀切都是对象,任何都不例外,对所有值类型应⽤ String.call() ⽅法结果如下:
console.log(String.call(123)) //[object Number] console.log(String.call('123')) //[object String] console.log(String.call(undefined)) //[object Undefined] console.log(String.call(true)) //[object Boolean] console.log(String.call({})) //[object Object]
console.log(String.call([])) //[object Array]
console.log(String.call(function(){})) //[object Function]判断是否为函数
function isFunction(it) {
return String.call(it) === '[object Function]';
}
判断是否为数组:
function isArray(o) {
return String.call(o) === '[object Array]';typeof array
}
利⽤这个特性,可以写⼀个⽐typeof instanceof更准确的判断⽅法:
var type = function (o) {
var s = String.call(o)
return s.match(/\[object(.*?)\]/)[1].toLowerCase()
}
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"复制代码
其他⽅法总结:
数组:
var a = [1, 2, 3]
var b = {}
Array.isArray(a)  //  true
Array.isArray(b)  // false

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