检测数据类型instanceof, typeof, Object.prototype.toString的区别

typeof:由于它有一些无法预知的行为,经常会导致检测数据类型时得到不靠谱 的结果。Safari(直至第 4 版)在对正则表达式应用 typeof 操作符时会返回"function",因此很难确 定某个值到底是不是函数。
//typeof

typeof undefined;  // "undefined"
typeof null;  // "object"

typeof ture;  // "boolean"
typeof false; // "boolean"

typeof NaN; // "number"
typeof Infinity // "number"
typeof 1  //"number"
typeof "abc"; //"string"

typeof function(){}; // "function"
typeof RegExp; //"function"
typeof Math; //"object"
instanceof:操作符在存在多个全局作用域(像一个页面包含多个 frame)的情况下,也 是问题多多。
//以下代码要返回 true,value 必须是一个数组,而且还必须与 Array 构造函数在同个全局作用域 中。(别忘了,Array 是 window 的属性。)如果 value 是在另个 frame 中定义的数组,那么以下代码 就会返回 false
var isArray = value instanceof Array;

//instanceof
var  data = [1, 2, 3, 4, 5];
data instanceof Array; //true
data instanceof Object; //true
data instanceof Number; //false

instanceof Number; //false
instanceof Object; //false

var num = 1;
num instanceof Number; //false
num instanceof Object; //false

var num = Number(1);  
num instanceof Number;  //false
num instanceof Object; //false

Number(1) instanceof Number; //false
Number(1) instanceof Object;  //false

var num1 = new Number(1);
num1 instanceof Number; //true
num1 instanceof object; //true

null instanceof Object; //false;
undefined instanceof Object; //false;

var  data = [1, 2, 3, 4, 5];
var bb = {};
var cc = function(){};
data instanceof bb; //TypeError: Expecting a function in instanceof check, but got #
data instanceof cc; //false

Object.prototype.toString.call():

var data = [1, 2, 3, 4, 5];
Object.prototype.toString.call(data);//"[object Array]"
可以定义如下的函数返回对象的类型信息

function classof(obj){
    if(obj === null){
        return "Null";
    }
    if(obj === undefined){
        return "Undefined";
    }
    return Object.prototype.toString.call(obj).slice(8, -1);
}
classof(null); // "Null"
classof(undefined) // "Undefined"
classof("abc"); // "String"
classof([]); // "Array"
classof({}); //"Object"
classof(//); // SyntaxError: Unexpected token }
classof(/,/); //"RegExp"
classof(new Date()); //"Date"

classof(window); // "global"
classof(function(){}); // "Function"
function f(){}; classof(new f()); //"Object"


//测试某个值是不是原生函数或正则表达式
function isFunction(value){
return Object.prototype.toString.call(value) == "[object Function]";
}
function isRegExp(value){
 }

你可能感兴趣的:(检测数据类型instanceof, typeof, Object.prototype.toString的区别)