一、typeof % g# w1 A; b9 o
主要用于判断基本数据类型 。使用方式:typeof(表达式)和typeof 变量名,第一种是对表达式做运算,第二种是对变量做运算。typeof运算符的返回类型为字符串,值包括如下几种:/ h* ~8 D( z7 c# o0 i
'undefined':未定义的变量或值 'boolean':布尔类型的变量或值 'string' :字符串类型的变量或值 'number':数字类型的变量或值 'object' :对象类型的变量或值,或者null(这个是js历史遗留问题,将null作为object类型处理) 'function' :函数类型的变量或值
: B/ g6 p5 w; B3 o. \3 T" h 示例如下:: R0 h3 s! R2 `' o6 _& O7 F
console.log(typeof a); //'undefined'
console.log(typeof(true)); //'boolean'
console.log(typeof '123'); //'string'
console.log(typeof 123); //'number'
console.log(typeof NaN); //'number'
console.log(typeof null); //'object'
var obj = new String(); console.log(typeof(obj)); //'object'
var fn = function(){}; console.log(typeof(fn)); //'function'
console.log(typeof(class c{})); //'function' typeof的不足之处:; d6 h( [/ }3 x" ^( p& U/ p' R
不能区分对象、数组、正则,对它们操作都返回"object";(正则特殊一点后面说) Safar5,Chrome7之前的版本对正则对象返回 'function' 在IE6,7和8中,大多数的宿主对象是对象,而不是函数;如:typeof alert; //object 而在非ID浏览器或则IE9以上(包含IE9),typeof alert; //function 对于null,返回的是object.8 Z8 Y6 X/ ~* _' @9 I. ^5 E
总结:) x1 R. t8 E8 v- t) N9 a$ h
typeof运算符用于判断对象的类型,但是对于一些创建的对象,它们都会返回'object',有时我们需要判断该实例是否为某个对象的实例,那么这个时候需要用到instanceof运算符。1 f2 @6 g* x9 O5 e: a
二、instanceof 6 O% G2 b) U- w( I q
用于引用数据类型的判断。所有引用数据类型的值都是Object的实例。目的是判断一个对象在其原型链上是否存在构造函数的prototype属性。用法:
e! d- J. r" l7 O: y. V3 z variable instanceof constructor 示例如下:* z" `( W5 ]& E! S- j4 t5 z
// example
var arr = [];
由于:
1. arr.constructor === Array
2. arr.__proto__ === Array.prototype
3. arr.__poto__.proto__ === Object.prototype
所以, 以下都返回true
1. arr instanceof arr.constructor(Array)
2. arr instanceof arr.__proto__.constructor(Array)
3. arr instanceof arr.__proto__.__poto__.constructor(Object)
如果你了解原型链的话,你很快就会得出一些结论:
1. 所有对象 instanceof Object 都会返回 true
2. 所有函数 instanceof Function 都会返回 true 总结:
) X/ e0 e# C/ |5 u) \6 G; J$ V2 g instanceof不仅能检测构造对象的构造器,还检测原型链。instanceof要求前面是个对象,后面是一个构造函数。而且返回的是布尔型的,不是true就是false。# r( S) f) Z V/ U
三、Array.isArray() - N) ^( B8 M4 u. R8 {$ W; t# q ~, Y1 W
Array.isArray()可以用于判断数组类型,支持的浏览器有IE9+、FireFox 4+、Safari 5+、Chrome; 兼容实现:
* Y( A& R% L+ e) \8 [. q! g if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
} 示例如下:
7 `$ k! l1 G/ w4 ~0 y/ q6 r // 1.
Array.isArray([1, 2, 3, 4]); // --> true
// 2.
var obj = {
a: 1,
b: 2
};
Array.isArray(obj); // --> false
// 3.
Array.isArray(new Array); // --> true
//4.
Array.isArray("Array"); // --> false 总结:
. A/ f. a# P& t. q isArray是一个静态方法,使用Array对象(类)调用,而不是数组对象实例。其中Array.prototype 也是一个数组,Array.isArray 优于 instanceof。
3 @' Q) A( }0 K. C8 T* b! o 四、Object.prototype.toString.call()
( |1 m$ O9 G- _: K5 P2 q 判断某个对象值属于哪种内置类型, 最靠谱的做法就是通过Object.prototype.toString方法。object.prototype.toString()输出的格式就是[object 对象数据类型]。
1 n$ ]! j2 q7 N; V: H! e 示例如下:
2 \4 G1 L% `: C& v& a- v console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]