1. 1.typeof:  语法:typeof 对象 或者 typeof(对象)
       返回对象的数据类型:只有原始数据类型:boolean number string undefined function object
  2.  
  3. 由于最初的BUG导致null的数据类型成为了object,现在,null 被认为是对象的占位符,从而解释了这一矛盾。
    缺陷:对于Array,null,Object对象和其他自定义对象使用typeof一律返回object;
  1. console.log(typeof(x)); //未声明x,返回undefined
  2. var y = false;
  3. console.log(typeof y); //boolean
  4. var str = "字符串";
  5. console.log(typeof str); //string
  6. var num = 5;
  7. console.log(typeof(num)); //number
  8. console.log(typeof NaN); //number NaN是一个特殊的数字---非数字
  9. var f1 = function () {
  10.  
  11. };
  12. console.log(typeof f1); //function
  13.  
  14. console.log(typeof null); //object
  15. var arr = [1, 2, 3];
  16. console.log(typeof arr); //object
  17. var obj = {name: "小伟", age: 15};
  18. console.log(typeof obj); //object
  19. var Person = function (name) {
  20. this.name = name
  21. };
  22. var per = new Person("小王");
  23. console.log(typeof per); //object
  1. 2.instanceof 用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
             解读:用于判断某个对象是不是某个构造函数的一个实例,或者是不是某个构造函数的一个后代实例
            语法:对象 instanceof 数据类型(或者构造函数名):返回true/false
      
  1. instanceof的原理:function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
    var O = R.prototype;// 取 R 的显示原型
    L = L.__proto__;// 取 L 的隐式原型
    while (true) {
    if (L === null)
    return false;
    if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
    return true;
    L = L.__proto__;
    }
    }
    即比较对象.__proto__和数据类型(构造函数).prototype,如果相等就为true,
    不同就继续跟着对象的原型链,比较对象隐式原型里的隐式原型与数据类型(构造函数).prototype
    根据原型链的知识直到原型链的最终,指向Object.prototype.__proto__---为null
  1. console.log(per instanceof Person); //true
  2. //per.__proto__指向其构造函数的原型对象Person.prototype,所以返回true
  3.  
  4. console.log(f1 instanceof Function); //true
  5. console.log(arr instanceof Array); //true
  6. console.log(obj instanceof Object); //true
  7. //同理,这些引用类型:Function、Array、Object、都可以视为一个构造函数
  8.  
  9. //对于继承的数据类型:新的实例对象根据原型链,数据类型可以是其构造函数名,也可以是其祖辈的构造函数名
  10. var Student = function (score) {
  11. this.score = score;
  12. }
  13.  
  14. Student.prototype = new Person("小李");
  15. var stu = new Student(100);
  16.  
  17. console.log(stu instanceof Student); //true stu.__proto__ == Student.prototype很易理解
  18. console.log(stu instanceof Person); //true
  19. /*
  20. * 根据原型链:stu.__proto__ == Student.prototype == new Person
  21. * stu.__proto__.__proto__ == new Person.__proto__ == Person.prototype
  22. *
  23. *
  24. * */

注意:

  1. * JavaScript中,一切都是一个对象( 或者至少被视为一个对象)
    * 唯一的non-objects是基本类型:布尔值,数字,字符串和undefined ,
    * 直接声明的这几种类型的实例不是object对象,但是可以访问其作为对象的一些属性和方法?为什么呢?
    *
    * 在访问基本类型数据的属性和方法时会临时出现一个包装对象:
    * 自动创建基本包装类型的对象,只执行一行代码的瞬间之后就会立即销毁。
         这意味着在运行时为基本包装类型值添加属性和方法是无效的。
    * 比如只要引用了字符串s的属性,JavaScript就会将字符串值通过调用new String(s)的方式转换成对象,成为了基本包装类型,
    * 这个对象继承了字符串(String)对象的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会被销毁
    *
    * instanceof 运算符只对对象有效:所以对于上述的几个non-object无效,所以判断他们的数据类型时返回值会是false
    *
    * 另外:布尔,数字,字符串有其构造函数,如果用其构造函数实例化一个对象,则可以使用instanceof判断其数据类型
    *
  1. var y = false;
  2. console.dir(y); //只是一个基本布尔值,没有内部结构
  3. console.log(y instanceof Boolean); //false
  4.  
  5. var z = new Boolean(false);
  6. console.dir(z); //利用构造函数创建布尔值,可以得到内部结构,具有对象的特征
  7. console.log(z instanceof Boolean); //true
  8.  
  9. console.log(y.__proto__); //由于基本包装类型的存在,可以临时访问其作为对象的属性,
  10. // 这样做时,会将y通过调用new Boolean得到一个临时的包装对象,具有对象特征,但是语句执行结束后就消失
  11. y.name = "布尔false";
  12. console.log(y.name); //undefined,无法对基本类型添加属性或方法
  13. //无法对基元类型的数据声明属性和方法,因为他们不是对象,
  14. // 可以利用包装类型的原理访问基元类型数据的属性和方法(如果他们所对应的包装对象有这个属性和方法的话,如果没有,返回undefined很容易理解)
  15.  
  16. console.log(str instanceof String); //false
  17. console.log(num instanceof Number); //false
  1. 3.借用Object原型里的一个方法 Object.prototype.toString.call(对象)
    可以得到对象的数据类型:包括:StringNumberBooleanundefinednullObjectfunctionArrayDateRegexp
    解决了typeof的缺陷
    但是无法得到自定义构造函数实例化对象的数据类型(构造函数名),只能获得Object
  2.  
  3. 注意:使用这个方法实际上是用call()方法借用Object原型里的一个方法,不能直接使用对象.toString(),
    因为对于一个对象,toString方法是被重新定义了的,是将obj转换为字符串的方法,
    直接使用对象.toString()根据原型链,在访问到这个重写的方法时就调用了,不能访问到Object原型里的这个同名的方法
  1. console.log(Object.prototype.toString.call(null));//[object Null]
  2. console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
  3. console.log(Object.prototype.toString.call(y)); //[object Boolean]
  4. console.log(Object.prototype.toString.call(str));//[object String]
  5. console.log(Object.prototype.toString.call(num));//[object Number]
  6. console.log(Object.prototype.toString.call(f1));//[object Function]
  7. console.log(Object.prototype.toString.call(arr));//[object Array]
  8. console.log(Object.prototype.toString.call(obj));//[object Object]
  9. console.log(Object.prototype.toString.call(per));//[object Object]
  10. console.log(Object.prototype.toString.call(new Date));//[object Date]
  1.  

JS获取对象数据类型的方法的更多相关文章

  1. JS获取对象“属性和方法”的方法

    平时在写的代码过程中,经常会遇到对对象Object的数据处理.而在对对象的数据处理中,操作最频繁的是“数据引用”.“值的修改”.“获取关键字(属性)”.平时最烦的也是“获取关键字”,经常忘记怎么去获取 ...

  2. js获取对象位置的方法

    scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最 ...

  3. JS获取对象“属性”的方法

    var testObj= new Object(); testObj.name = "shangguan"; testObj.age= ; testObj.action = fun ...

  4. (转)用JS获取地址栏参数的方法(超级简单)

    转自http://www.cnblogs.com/fishtreeyu/archive/2011/02/27/1966178.html 用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获 ...

  5. js 获取对象属性个数

    js 获取对象属性个数 方法一: var attributeCount = function(obj) { var count = 0; for(var i in obj) { if(obj.hasO ...

  6. JS获取div高度的方法

    有时在写页面时,需要获取一个div的高度.怎么才能获取呢?哈哈,先上结论.有两种方法. offsetHeight .clientHeight getComputedStyle offsetHeight ...

  7. js获取对象、数组的实际长度,元素实际个数

    /*获取对象.数组的长度.元素个数 *@param obj 要计算长度的元素,可以为object.array.string */ function count(obj){ var objType = ...

  8. JS获取网页宽高方法集合

    JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...

  9. js获取url参数的方法

    js获取url参数的方法有很多. 1.正则分析 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...

随机推荐

  1. Jboss项目部署出现java.lang.UnsupportedClassVersionError 问题的解决方法

    出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误. 解决 ...

  2. 第四周博客作业 <西北师范大学| 周安伟>

    一,助教博客链接https://home.cnblogs.com/u/zaw-315/ 二,本周点评作业量点评23份,对提交的优秀作业代码进行运行一份博客问题无法点评问题博客链接:https://ww ...

  3. QT Designer基础——登录界面设计基础版

    认识QT Designer提供的可选控件:以下八个大类 Layouts:布局相关 Spacers:留空 Buttons:可点击的按钮类 Item Views和 Item Widgets:高级控件,例如 ...

  4. Ubuntu 16.04 上安装 PCL 1.8.0

    Ubuntu16.04之后安装pcl可以直接apt-get sudo apt-get install libpcl-dev pcl-tools 安装之前,准备一些依赖库 sudo apt-get up ...

  5. linux之systemd---学习

    linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化.内核初始化的最后一步就是启动 PID 为 1 的 init 进 ...

  6. iOS多图上传

    iOS多图上传涉及到多线程问题,个人比较喜欢使用GCD操作,下边是最近写的一个多图上传代码,附带相关注释 __block BOOL allSucc = YES; __block int m = 0; ...

  7. 传递参数:java代码中形参的改变有没有影响实参?

    实参:可以是常量.变量.表达式.函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参. 因此应预先用赋值,输入等办法使实参获得确定值. 形参:全称为“形 ...

  8. Taro-ui TabBar组件使用路由跳转

    1. 安装taro-ui (此处使用cnpm) cnpm install taro-ui 2. 全局引入样式 app.scss sass :@import "~taro-ui/dist/st ...

  9. [转]JSOUP 抓取HTTPS/HTTP网页,校验问题

    针对一般的http请求是不需要的校验的.但是https安全校验过总过不去.最后找到以下方法,终于成功. 让我们的站点信任所有站点,不需要引包,系统自带ssl证书校验,话不多数,贴代码. /** * 信 ...

  10. linux(centos) tomcat设置开机启动

    亲测有效 环境: centos7 apache-tomcat-8.5.37 设置步骤: 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本, ...