怎样推断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方法,简单总结下,欢迎补充!

推断js中的类型:typeof / instanceof / constructor / prototype的更多相关文章

  1. JS中基本类型与包装类型的关系

    对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...

  2. js中boolean类型的理解

    <html> <head> <script type="text/javascript"> var x="12"; aler ...

  3. js中属性类型:数据属性与访问器属性

    js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...

  4. JS中Float类型加减乘除 修复 JQ 操作 radio、checkbox 、select LINQ to SQL:Where、Select/Distinct LINQ to SQL Count/Sum/Min/Max/Avg Join

    JS中Float类型加减乘除 修复   MXS&Vincene  ─╄OvЁ  &0000027─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄Ov ...

  5. JS中数值类型的本质

    一.JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型--number,它包含了整型.浮点型等数值类型.其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储.第一部分是有效位数,也 ...

  6. JS中的类型识别

    JS为弱类型语言,所以类型识别对JS而言尤为重要,JS中常用的类型识别方法有4种:typeof.Object.prototype.toString.constructor和instanceof. (1 ...

  7. 关于js中的类型内容总结(类型识别)

    JS 有7种数据类型: 6种原始类型:Boollean    String   Number    Null    Underfined   Symbol 引用类型:Object 类型识别主要有以下四 ...

  8. js中date类型的格式转化为yyyy-MM-dd HH:mm:ss的String类型

    在vue中或其他框架中可以在Date的原型链中添加Format的方法,如ruoyi可以写在main.js中更好,如果写在utils还需要去导入包. 正常的js直接放到utils.js就好 Date.p ...

  9. Js中各类型数据到bool的转换

    在返回Json字符串给前台时遇到的问题,返回的bool数据总是为TRUE 特意查了一下,发现了Js中各类数据转换到bool型是的结果. 希望能给遇到同样问题的人一点帮助.  数据类型  转换为bool ...

随机推荐

  1. DllMain加载其他DLL造成的死锁问题及其解决办法

    使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+.我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance ...

  2. HDU 2215 Maple trees

    增量法的最小包围圈算法,不会…… #include <cstdio> #include <cstring> #include <iostream> #include ...

  3. 记NOIP分数出来前

    咩~成绩还没有出来呢!但是拿到了每个人的程序,还有一堆民间的数据.我测了好多不同的数据,基本上D1T1,D2T1,D2T2的都是暴力解决掉的,没有什么问题,唯一就是D1T2的link那一题,写的时候2 ...

  4. Objective-C浅拷贝和深拷贝

    浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间 如: char* str = (char*)malloc(100);char* str2 = str; 浅拷贝只是对对象的简单拷贝 ...

  5. Python学习入门基础教程(learning Python)--2.2.1 Python下的变量解析

    前文提及过变量代表内存里的某个数据,这个说法有根据么? 这里我们介绍一个python内建(built-in)函数id.我们先看看id函数的帮助文档吧.在python查某个函数的帮助文档很简单,只用he ...

  6. c#简单的调试信息、日志信息输出

    public static void ErrorLog(string mssg) { string FilePath = "D:/logs/ErrorLog.txt"; try { ...

  7. 类似jquery的一个demo

    通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...

  8. 纯css画哆啦A梦

    今天有点无聊,照着网上的图写了个哆啦A梦,无技术可言,纯考耐心. <!doctype html> <html lang="en"> <head> ...

  9. win64位 apache2.4 php5.4 mysql5.6

    apache2.4 php5.4 mysql5.6 源文件下载 +以前的配置数据参考 链接:http://pan.baidu.com/s/1skfmGyT 密码:hqtp 比较好的参考资料 http: ...

  10. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...