Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251589
  • 博文数量: 45
  • 博客积分: 170
  • 博客等级: 入伍新兵
  • 技术积分: 488
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-13 14:43
文章分类

全部博文(45)

文章存档

2014年(2)

2013年(35)

2012年(8)

我的朋友

分类: JavaScript

2013-09-05 14:27:29

    1.typeof

    typeof是我们在做类型判断时最常用的方法,他的优点就是简单、好记,缺点是不能很好的判断object、null、array、regexp和自定义对象。

    下面是我的测试代码:
    

点击(此处)折叠或打开

  1. var str='str';
  2. var arr=['1','2'];
  3. var num=1;
  4. var bool=true;
  5. var obj={name:'test'};
  6. var nullObj=null;
  7. var undefinedObj=undefined;
  8. var reg=/reg/;

  9. function fn(){
  10.     alert('this is a function');
  11. }

  12. function User(name){
  13.     this.name=name;
  14. }
  15. var user=new User('user');

  16. console.log(typeof str);
  17. console.log(typeof arr);
  18. console.log(typeof num);
  19. console.log(typeof bool);
  20. console.log(typeof obj);
  21. console.log(typeof nullObj);
  22. console.log(typeof undefinedObj);
  23. console.log(typeof reg);
  24. console.log(typeof fn);
  25. console.log(typeof user);
    output:string,object,number,boolean,object,object,undefined,object,function,object
    

    2.constructor

  现在介绍一种不常使用的方法,对象构造器constructor。他的优点是支持大部分对象类型的判断,特别是对自定义对象的判断;缺点是不能在null和undefined上使用。

  测试代码和之前的差不多,区别就是使用XXX.constructor代替了typeof,而且需要对结果进行处理才能得到类型。

点击(此处)折叠或打开

  1. var str='str';
  2. var arr=['1','2'];
  3. var num=1;
  4. var bool=true;
  5. var obj={name:'test'};
  6. var nullObj=null;
  7. var undefinedObj=undefined;
  8. var reg=/reg/;
  9. function fn(){
  10.     alert('this is a function');
  11. }
  12. function User(name){
  13.     this.name=name;
  14. }
  15. var user=new User('user');

  16. console.log(str.constructor);
  17. console.log(arr.constructor);
  18. console.log(num.constructor);
  19. console.log(bool.constructor);
  20. console.log(obj.constructor);
  21. console.log(reg.constructor);
  22. console.log(fn.constructor);
  23. console.log(user.constructor);

  24. console.log(nullObj.constructor);
  25. console.log(undefinedObj.constructor);
    output:
      function String() {[native code]}
    function Array() { [native code] }
    function Number() { [native code] }
    function Boolean() { [native code] }
    function Object() { [native code] }
    function RegExp() { [native code] }
    function Function() { [native code] }
    function User(name){ this.name=name; }
    后两句出错;
    

    3.Object.prototype.toString.call()

  最后要介绍的是jquery中使用的方式,Object.prototype.toString.call()。同样需要对结果继续处理(slice(8,-1)),优点是支持绝大多数类型的判断,唯一的缺点是不支持自定义对象的判断。

  测试代码如下:

点击(此处)折叠或打开

  1. var str='str';
  2. var arr=['1','2'];
  3. var num=1;
  4. var bool=true;
  5. var obj={name:'test'};
  6. var nullObj=null;
  7. var undefinedObj=undefined;
  8. var reg=/reg/;
  9. function fn(){
  10.     alert('this is a function');
  11. }
  12. function User(name){
  13.     this.name=name;
  14. }
  15. var user=new User('user');

  16. var toString=Object.prototype.toString;

  17. console.log(toString.call(str));
  18. console.log(toString.call(arr));
  19. console.log(toString.call(num));
  20. console.log(toString.call(bool));
  21. console.log(toString.call(obj));
  22. console.log(toString.call(reg));
  23. console.log(toString.call(fn));
  24. console.log(toString.call(user));
  25. console.log(toString.call(nullObj));
  26. console.log(toString.call(undefinedObj));
    output:
    [object String]
    [object Array]
    [object Number]
    [object Boolean]
    [object Object]
    [object RegExp]
    [object Function]
    [object Object]
    [object null]
    [object Undefined]

    console.log(toString.call(user)); 的返回结果为:[object Object],不能做进一步判断。

    通过上面的例子,大家一定对这三种方式有了更深刻的认识,熟悉他们的优缺点,然后可以根据自己的需要选择合适的方式。推荐使用Object.prototype.toString.call()方法,因为他能解决绝大部分情况的判断,在遇到返回值为[object Object]时,再使用constructor辅助判断,看是否是自定义对象。

信息来源:http://www.cnblogs.com/softlover/archive/2012/11/30/2795515.html




阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~