jquery判断是否对象-2、如何判断已知对象的类型:instanceof

使用typeof来判断非Object类型,使用constructor来判断Object(但要注意继承问题,如果有继承问题,可以使用constructor,如文章中所解释)和instanceof。 可以使用instanseof来判断对象中的Array类型(用它来判断Object会出现偏差),一般判断方法使用Object.prototype.toString和jquery.type()

ECMAScript规范中一共定义了7种数据类型,分为基本类型和引用类型两类,如下:

基本类型统称为简单类型,因为它们占用固定的空间,并且是简单的数据段。 为了方便提高变量查询率,将它们存储在栈中jquery判断是否对象,即按值访问。

引用类型统称为复杂类型。 因为它们的值的大小会发生变化,所以不能将它们存储在栈上,否则会增加变量查询率。 因此,它们的值存储在堆中,而变量存储的值,是一个指针,指向存储对象的显存,即通过地址访问。 除了Object之外jquery判断是否对象,引用类型还包括Function、Array、RegExp、Date等。

鉴于 ECMAScript 是松散类型的,需要有一种方法来检查给定变量的数据类型。 对于这个问题,JavaScript也提供了多种方法,但遗憾的是,不同方法得到的结果是混杂的。

下面介绍五种常用的方法,并简要分析每种方法存在的问题。

1.最常见的判断方法:typeof

typeof用的比较多的时候,是判断某个全局变量是否存在,某个页面是否定义了全局变量。 如果你做出以下判断:

// haorooms 是全局变量if(haorooms!=undefined){}
// js 会报错:Uncaught ReferenceError: haorooms is not defined

判断对象是否为空对象_判断对象是否为空的工具类_jquery判断是否对象

解决办法是我们这样写:

if(typeof haorooms!=undefined){}

使用typeof后就不会报错了! 这就是typeof的应用之一!

typeof 是一个运算符,它在其左侧接受一元表达式并返回该表达式的数据类型。 返回的结果用该类型的字符串(全部大写字母)表示,包括以下7种类型:数字、布尔值、符号、字符串、对象、未定义、函数等。

typeof ''; // string 有效typeof 1; // number 有效typeof Symbol(); // symbol 有效typeof true; //boolean 有效typeof undefined; //undefined 有效typeof null; //object 无效typeof [] ; //object 无效typeof new Function(); // function 有效typeof new Date(); //object 无效typeof new RegExp(); //object 无效

有时,typeof 运算符会返回一些令人困惑但技术上正确的值:

其中,null有自己的数据类型Null,引用类型中的字段、日期、正则表达式也有自己特定的类型。 Typeof 在处理这些类型时仅返回其原型链顶部的 Object 类型。 没有错,但不是我们想要的。

对于null->“object”的问题,仅typeof是没有办法解决的,只要记住有这么一个坑就可以了。

至于array->“object”的问题,建议使用:Array.isArray([])//true来判断。

2、判断已知对象类型的方式:instanceof

可以用来判断是否是链表。

var haorooms=[];console.log(haorooms instanceof Array) // 返回 true

instanceof用于判断A是否是B的实例,表达式为:AinstanceofB。 如果 A 是 B 的实例,则返回 true,否则返回 false。 这里需要非常注意的是instanceof衡量的是原型,我们用一段伪代码来模拟它的内部执行过程:

instanceof (A,B) = {    var L = A.__proto__;    var R = B.prototype;    if(L === R) {        // A的内部属性 __proto__ 指向 B 的原型对象        return true;    }    return false;}

从上面的过程可以看出,当A的原型指向B的原型时,A就是B的实例。我们看几个反例:

[] instanceof Array; // true{} instanceof Object;// truenew Date() instanceof Date;// truefunction Person(){};new Person() instanceof Person;[] instanceof Object; // truenew Date() instanceof Object;// truenew Person instanceof Object;// true

我们发现instanceof虽然可以判断[]是Array的实例,但是它认为[]也是Object的实例。 为什么?

我们来分析一下[]、Array、Object之间的关系:

从instanceof可以判断,[].proto指向Array.prototype,Array.prototype.proto指向Object.prototype。 最后,Object.prototype.proto指向null,标志着原型链的结束。 因此,[]、Array、Object内部生成了一条原型链。

从原型链可以看出,[]的proto直接指向Array.prototype,间接指向Object.prototype,所以根据instanceof的判定规则,[]是Object的实例。 以此类推,类似的newDate()和newPerson()也会生成对应的原型链。 因此,instanceof只能用来判断两个对象是否属于实例关系,而不能判断一个对象实例属于哪种类型。

instanceof 运算符的问题在于它假设只有一个全局执行环境。 如果网页包含多个框架,则实际上存在两个以上不同的全局执行环境,因此存在两个以上不同版本的构造函数。 如果将链表从一个框架传递到另一个框架,则传入的字段将具有与第二框架中本机创建的字段不同的构造函数。

var iframe = document.createElement('iframe');document.body.appendChild(iframe);xArray = window.frames[0].Array;var arr = new xArray(1,2,3); // [1,2,3]arr instanceof Array; // false

针对字段的这个问题,ES5提供了Array.isArray()方法。 该方法用于确认对象本身是否为Array类型,而不区分对象是在哪个环境中创建的。

if (Array.isArray(value)){   //对数组执行某些操作}

Array.isArray() 本质上测量对象的 [[Class]] 值。 [[Class]] 是对象的内部属性。 它包含对象的类型信息。 其格式为[objectXxx],Xxx对应具体类型。 对于链表,[[Class]] 的值为 [objectArray]。

alert(c instanceof Array) -----------> truealert(d instanceof Date)alert(f instanceof Function) --------> truealert(f instanceof function) --------> false

注意:对象类型必须在instanceof前面,大小写不能错。 这种方法适合一些条件选择或者分支。

判断对象是否为空的工具类_jquery判断是否对象_判断对象是否为空对象

3.根据对象的构造函数来判断:constructor

alert(c.constructor === Array) ----> true
alert(d.constructor === Date) -----> true
alert(e.constructor === Function) ----> true

注意:类继承时构造函数会出错

function A(){};function B(){};A.prototype = new B(); //A继承自Bvar aObj = new A();alert(aobj.constructor === B) -------> true;alert(aobj.constructor === A) -------> false;

不过instanceof方法就不存在这个问题,对象的直接继承和间接继承都会报true:

alert(aobj instanceof B) --------> true;alert(aobj instanceof A) --------> true;

言归正传,解决构造函数的问题一般就是让对象的构造函数自动指向自身:

aobj.constructor = A; // 将自己的类赋值给对象的 constructor 属性alert(aobj.constructor === A) -------> true;alert(aobj.constructor === B) -------> false; // 基类不会报 true 了;

4. 复杂且通用:toString

toString()是Object的原型方法。 调用此技术默认返回当前对象的[[Class]]。 这是一个内部属性,其格式为 [objectXxx],其中 Xxx 是对象的类型。

对于Object对象,直接调用toString()返回[objectObject]。 对于其他对象,需要调用/apply返回正确的类型信息。

Object.prototype.toString.call('') ;   // [object String]Object.prototype.toString.call(1) ;    // [object Number]Object.prototype.toString.call(true) ; // [object Boolean]Object.prototype.toString.call(Symbol()); //[object Symbol]Object.prototype.toString.call(undefined) ; // [object Undefined]Object.prototype.toString.call(null) ; // [object Null]Object.prototype.toString.call(new Function()) ; // [object Function]Object.prototype.toString.call(new Date()) ; // [object Date]Object.prototype.toString.call([]) ; // [object Array]Object.prototype.toString.call(new RegExp()) ; // [object RegExp]Object.prototype.toString.call(new Error()) ; // [object Error]Object.prototype.toString.call(document) ; // [object HTMLDocument]Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

5、无敌万能的方法jquery.type()

如果该对象未定义或为 null,则返回相应的未定义或 null。

jQuery.type( undefined ) === "undefined"jQuery.type() === "undefined"jQuery.type( window.notDefined ) === "undefined"jQuery.type( null ) === "null"

如果该对象具有与浏览器的外部对象[[Class]]相同的内部[[Class]],我们返回相应的[[Class]]名称。 (有关此技术的更多详细信息。)

jQuery.type( true ) === "boolean"jQuery.type( 3 ) === "number"jQuery.type( "test" ) === "string"jQuery.type( function(){} ) === "function"jQuery.type( [] ) === "array"jQuery.type( new Date() ) === "date"jQuery.type( new Error() ) === "error" // as of jQuery 1.9jQuery.type( /test/ ) === "regexp"

其他所有内容都将返回其类型对象。

总结:一般情况下,typeof就足够了。 当对象类型已知时,可以使用instanceof或构造函数。 如果你别无选择,请使用 $.type()。