推断js中的类型:typeof / instanceof / constructor / prototype

推断js中的类型:typeof / instanceof / constructor / prototype

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

怎样推断js中的类型呢,先举几个样例:

var a = “jason”;

var b = 123;

var c = true;

var d = [1,2,3];

var e = new Date();

var f = function(){

    alert(‘jason’);

};

一、最常见的推断方法:typeof

    typeof是一个一元运算符,它返回的结果始终是一个字符串,对不同的操作数,它返回不同的结果,另外typeof能够推断function的类型;在推断除Object类型的对象时比較方便。

console.log(typeof a == “string”);        //true

console.log(typeof a == String);        //false

详细的规则例如以下:

  1) 对于数字类型的操作数而言, typeof 返回的值是 number。比方说:typeof 1,返回的值就是number。

    上面是举的常规数字,对于很规的数字类型而言,其结果返回的也是number。比方typeof NaN,NaN在JavaScript中代表的是特殊非数字值,尽管它本身是一个数字类型。

    在JavaScript中,特殊的数字类型还有几种:

Infinity                     //表示无穷大特殊值

NaN                         //特殊的非数字值

Number.MAX_VALUE             //可表示的最大数字

Number.MIN_VALUE             //可表示的最小数字(与零最接近)

Number.NaN                     //特殊的非数字值

Number.POSITIVE_INFINITY    //表示正无穷大的特殊值

Number.NEGATIVE_INFINITY    //表示负无穷大的特殊值

    以上特殊类型,在用typeof进行运算进,其结果都将是number。

  2) 对于字符串类型,typeof返回的值是string。比方typeof  “jason”返回的值是string。

  3) 对于布尔类型,typeof返回的值是boolean。比方typeof true返回的值是boolean。

  4) 对于对象、数组、null返回的值是object。比方typeof {},typeof [],typeof null返回的值都是object。

  5) 对于函数类型,返回的值是function。比方:typeof eval,typeof Date返回的值都是function。

  6) 假设运算数是未定义的(比方说不存在的变量、函数或者undefined),将返回undefined。比方:typeof jason、typeof undefined都返回undefined。

console.log(typeof a);                    //string

console.log(typeof b);                    //number

console.log(typeof c);                    //boolean

console.log(typeof d);                    //object

console.log(typeof e);                    //object

console.log(typeof f);                    //function

console.log(typeof 1);                    //number

console.log(typeof NaN);                //number

console.log(typeof Number.MIN_VALUE);    //number

console.log(typeof Infinity);            //number

console.log(typeof “123”);                //string

console.log(typeof true);                //boolean

console.log(typeof {});                    //object

console.log(typeof []);                    //object

console.log(typeof null);                //object

console.log(typeof eval);                //function

console.log(typeof Date);                //function

console.log(typeof sss);                //undefined

console.log(typeof undefined);            //undefined

二、推断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例:instanceof

    注意:instanceof 后面一定要是对象类型,而且大写和小写不能错,该方法适合一些条件选择或分支。

console.log(d instanceof Array);        //true

console.log(e instanceof Date);            //true

console.log(f instanceof Function);        //true

三、依据对象的constructor推断:constructor

console.log(d.constructor === Array)    //true

console.log(e.constructor === Date)        //true

console.log(f.constructor === Function)    //true

注意constructor在类继承时会出错

比如:

    function A(){};

    function B(){};

    var aObj = new A();

    console.log(aObj.constructor === A);    //true;

    console.log(aObj.constructor === B);    //false;

    

    function C(){};

    function D(){};

    C.prototype = new D(); //C继承自D

    var cObj = new C();

    console.log(cObj.constructor === C);    //false;

    console.log(cObj.constructor === D);    //true;

    

而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:

    console.log(cObj instanceof C);            //true

    console.log(cObj instanceof D);            //true

    

解决construtor的问题一般是让对象的constructor手动指向自己:

    cObj.constructor = C;                     //将自己的类赋值给对象的constructor属性

    console.log(cObj.constructor === C);    //true;

    console.log(cObj.constructor === D);    //false; 基类不会报true了;

    

    

四、通用但非常繁琐的方法:prototype    

    console.log(Object.prototype.toString.call(a) === ‘[object String]’);        //true

    console.log(Object.prototype.toString.call(b) === ‘[object Number]’);        //true

    console.log(Object.prototype.toString.call(c) === ‘[object Boolean]’);        //true

    console.log(Object.prototype.toString.call(d) === ‘[object Array]’);        //true

    console.log(Object.prototype.toString.call(e) === ‘[object Date]’);            //true

    console.log(Object.prototype.toString.call(f) === ‘[object Function]’);        //true

    注:大写和小写不能写错,比較麻烦,但胜在通用。

总结:

    通常情况下用typeof推断就能够了,遇到预知Object类型的情况能够选用instanceof或constructor方法,简单总结下,欢迎补充!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118395.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sqlserver2005备份集中的数据库备份与现有的数据库不同

    sqlserver2005备份集中的数据库备份与现有的数据库不同 使用SqlServer 2005还原 2000的备份数据库时,报备份集中的数据库备份与现有的数据库不同的错误.

    主要由于新建的数据与备份集中的不同导致

    解决办法:选项 -->还原选项 -->覆盖现有数据库 --> 确

    2022年5月7日
    35
  • windows10禁止自动更新

    windows10禁止自动更新最近被win10系统自动更新折磨的难受。于是百度各种禁止方法,都是治标不治本,两三天的样子就恢复了。最终找到一个第三方禁止还不错。一、win10家庭中文版 1.百度第一种:(阻挡不了微软的更新,只能暂时禁止,2.3天就会恢复)失败告终 2.第二种:(修改注册表更新路径,还是没作用)失败告终3.第三种:第三方小工具禁止 (暂时没…

    2022年6月13日
    24
  • 图像处理算法工程师——1必备技能总结——2面试题大全[通俗易懂]

    图像处理算法工程师——1必备技能总结——2面试题大全[通俗易懂]图像算法工程师三重境界:一、传统图像算法工程师:主要涉及图形处理,包括形态学、图像质量、相机成像之3A算法、去雾处理、颜色空间转换、滤镜等,主要在安防公司或者机器视觉领域,包括缺陷检测;二、现代图像算法工程师:涉及模式识别,主要表现的经验为Adaboost、SVM的研究与应用,特征选取与提取,包括智能驾驶的研究与应用、行人检测、人脸识别;三、人工智能时代图像算法工程师:…

    2022年5月17日
    55
  • JAVA中单例模式_Java中哪些是单例的

    JAVA中单例模式_Java中哪些是单例的1.说明1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)3)单例模式要素:a)私有构造方法b)私有静态引用指向自己实例c)以自己实例为返回值的公有静态方法2.实例饿单例…

    2022年8月11日
    3
  • stimulsoft oracle,报表仪表设计器Stimulsoft的处理数据功能

    stimulsoft oracle,报表仪表设计器Stimulsoft的处理数据功能StimulsoftReports.Net是一个基于.NET框架的报表生成器,能够帮助你创建结构、功能丰富的报表。StimulReport.Net的报表设计器不仅界面友好,而且使用便捷,能够让你轻松创建所有报表;该报表设计器在报表设计过程中以及报表运行的过程中都可以使用。在运行时使用StimulReport.Net的报表设计器不需要支付任何的专利费用。所创建的报表既可以在Windows窗体应用…

    2022年7月13日
    18
  • Windows日志分析工具_Windows7激活工具

    Windows日志分析工具_Windows7激活工具Windows主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx包含由应用程序或系统程序记录的事件,主要记录程序运行程序方面的事件。安全日志:%SystemRoot%\Syste

    2022年9月4日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号