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

时间: 2024-10-05 23:49:35

推断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类型的对象时

判断对象类型 typeof instanceof Object.prototype.tostring()

常见的有三种方法  1, typeof  2, instance of   3, object.prototype.toString.apply(); 1,typeof  typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于

JS中的类型检测

JS中用于类型检测的函数有typeof.instanceof .Object.prototype.toString.constrcutor.duck type typeof用于检测基本类型和函数 有些特殊情况 null.数组.Date数据类型用typeof判断返回的是object instanceof用来判断对象类型,基于原型链,可以用来判断数组和Date数据类型

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

对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>E

js中boolean类型的理解

<html> <head> <script type="text/javascript"> var x="12"; alert(x+234); alert(typeof (x+234)); var flag=false; //true=1 false=0; alert(flag+34); </script> </head> <body> String str="ere"; i

js 中的类型比较

console.log(typeof 1) // number console.log(typeof 'cc') // string console.log(typeof true) // boolean console.log(typeof undefined) // undefined console.log(typeof null) // object console.log(typeof NULL) // undefined NULL | Null 都不对 console.log(typ

js中的类型和函数参数传递类型问题

js中的类型: 2大类型:原始类型和对象. 原始类型有 boolean.number.string这三个普通原始类型,还有null.undefined这俩特殊原始类型 对象嘛就多了,普通对象.内置对象.全局对象.函数.数组等. 函数参数传递类型: 对于原始类型,传递的是值,即复制一份传入函数,在函数内部修改不影响外部变量本身. 对于对象类型,传递的是地址,在函数内部修改对象时会导致外部变量发生变化. 注意这种情况!参考如下代码: var oMyObj = {name:"罗伯特"}; f

JS中的类型识别

JS为弱类型语言,所以类型识别对JS而言尤为重要,JS中常用的类型识别方法有4种:typeof.Object.prototype.toString.constructor和instanceof. (1)typeof可以识别标准类型(Null除外),不能识别具体的对象类型(Function除外),举例如下: 1 console.log(typeof("tom")); //"string" 2 console.log(typeof(12)); //"numbe

js中基本类型的值和引用类型的值的比较

1.动态属性方面的比较 1)基本类型的值是不能添加属性的,即使不会产生任何错误: 2)引用类型的值可以动态的添加属性,以便后面的使用: 1 var cat='cat'; 2 cat.name='Tom'; 3 console.log(cat.name);//undefined 4 5 6 var mouse={}; 7 mouse.name='Jerry'; 8 console.log(mouse.name);//Jerry 2.变量值复制方面的比较 1)基本类型复制的是原始值,不同变量之间不会