js是弱类型的语言,所以在声明变量时无需设定类型.但这也会产生一些问题,所以某些场景下进行js变量类型的检测很有必要.
通用的类型检测方法
1. 通用检测方法1
Function.prototype.call.bind(Object.prototype.toString);
2. 通过检测方法2
Object.prototype.toString.call(obj)
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
var array = [1, 2, 3]; // [object Array]
var date = new Date(); // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g; // [object RegExp]
var func = function a(){}; // [object Function]
3. 以上两种方法的区别:
第一种方法是许多框架所采用的方法,采用的原因主要是可以防止原型污染.采用第二种方式时,若自己在代码中重写了Object.prototype.toString方法,将得不到正确的结果,但是第一种写法仍然可以。
typeof类型检测
typeof能够检测出基本数据类型,比如number, undefined, string, boolean, function, 但是typeof null 和 typeof {},以及 typeof []都是object.所以需要检测某个非object类型的变量可以使用typeof.
type of new Date() ===> object;type of new Error() ===> object
instanceof类型检测
a instanceof A 检测a是否是A的实例,是返回 true,不是返回false;
[] instanceof Object ===> true; [] instanceof Array ===> true;
1 instanceof Number ===> false; new Number(1) instanceof Number ===> true;
'1' instanceof String ===> false; new String('1') instanceof String ===> true;
false instanceof Boolean ===> false; new Boolean(false) instanceof Boolean ===> ture;
通过上面的例子可以分析: 通过new得到的实例一定是该类型的实例(感觉像废话,不过确实是这样的);所以通过instanceof去判断变量类型有局限性.
总结: 判断变量类型最好的方法是采用通过方法中的第一种或者第二种.
判断对象是否是window对象
function isWindow( obj ) {
return obj != null && obj === obj.window;
// window === window.window ===> true
}
判断对象是否是DOM元素
isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};