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 #<Object>
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){
}