第一种方法typeof

typeof是一种运算符,它的值有以下几种

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ces</title>
</head>
<body>
<script>
console.log(typeof "Liesbeth");//"string"
console.log(typeof 12);//"number"
console.log(typeof true); //"boolean"
console.log(typeof undefined);//"undefined"
console.log(typeof null);//"object"
console.log(typeof {name:"Liesbeth"});//"object"
console.log(typeof function(){});//"function"
console.log(typeof []);//"object"
console.log(typeof new Date);//"object"
console.log(typeof /[0-9]/);//'object'
console.log(typeof new Number(123));//'object'
function Person(){};
console.log(typeof new Person);//'object' </script> </body>
</html>

typeof

运行结果如下,可以看出typeof能判断基本类型的值,其他通过new创建的类型除了function外,其他都是object,其中null也是object

第二种方法instanceof

instanceof运算符可以用来判断某个构造函数的prototype属性所指向的對象是否存在于另外一个要检测对象的原型链上即某个对象是否是某个构造函数的实例,如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ces</title>
</head>
<body>
<script>
//能判别内置对象内型
console.log([] instanceof Array);//true
console.log([] instanceof Object);//true
console.log(/[0-9]/ instanceof RegExp);//true
console.log(new String('123') instanceof String);//true
console.log(function(){} instanceof Function);//true //不能判断原始类型
console.log('123' instanceof String);//false
console.log(123 instanceof Number);//false
console.log(true instanceof Boolean);//false //判别自定义对象类型
function Point(x,y){
this.x=x;
this.y=y;
}
function Circle(x,y,r){
Point.call(this,x,y);
this.radius=r;
}
Circle.prototype=new Point();
Circle.prototype.constructor=Circle;
var c= new Circle(1,1,2);
console.log(c instanceof Circle);//true
console.log(c instanceof Point);//true
</script> </body>
</html>

instanceof

运行结果如下图

由此可看出instanceof不能识别原始类型,能识别自定义对象和内置对象类型同时它们都属于Object

 第三种方法Object.prototype.toString.call

这个方法获取的是对象的[[Class]]属性值,返回结果是固定的'[object'+[[class]]属性+']',jquery中的$.type()就是利用这个属性判断对象类型的。

function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1);
}

运行结果如下:

其中的type(c)为instanceof时创建的对象。

可以看出toString能识别原始类型和内置对象,但是不能识别自定义对象类型,另外在ie7和8中null和undefined都是返回"Object"如下

同时在IE6中字符串也会返回"Object"所以用的时候要多注意这几个值。

第四种方法constructor

constructor 属性返回对创建此对象的数组函数的引用,如图所示

利用此特性我们可以判别类型,其中由于null和undefined没有构造函数所以特殊处理,编写函数如下

function getConstructorName(obj){
return (obj===undefined||obj===null)?obj:(obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
}

运行结果如下

可以看出constructor能判别原始类型(除null和undefined),内置对象和自定义对象.

参考资料:http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html其中对Object.prototype.toString解释的清楚。

 

js中类型识别的方法的更多相关文章

  1. javascript四种类型识别的方法

    × 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...

  2. node.js中的url.parse方法使用说明

    node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...

  3. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  4. js中this和回调方法循环-我们到底能走多远系列(35)

    我们到底能走多远系列(35) 扯淡: 13年最后一个月了,你们在13年初的计划实现了吗?还来得及吗? 请加油~ 主题: 最近一直在写js,遇到了几个问题,可能初入门的时候都会遇到吧,总结下. 例子: ...

  5. js中object的申明方法

    //js中的对象申明使用new Object(); //object类型的数据类似于数组通过下表来访问其中的值 //example1 var person=new Object(); person.n ...

  6. JS中令人发指的valueOf方法介绍

    彭老湿近期月报里提到了valueOf方法,兴致来了翻了下ECMA5里关于valueOf方法的介绍,如下: 15.2.4.4 Object.prototype.valueOf ( ) When the ...

  7. JS中定义类的方法<转>

    转载地址:http://blog.csdn.net/sdlfx/article/details/1842218 PS(个人理解): 1) 类通过prototype定义的成员(方法或属性),是每个类对象 ...

  8. JS中判断数组的方法

    JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...

  9. JS 中类型鉴别

    JS中的基本类型有:数字(Number(NaN,Infinity)),字符串(String),Undefined,Null,Boolean 引用类型有:数组(Array),对象(Object),函数( ...

随机推荐

  1. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  2. hibernate -- HQL语句总结

    1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query ...

  3. PHP 单例模式

    一.什么是单例模式? 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2. ...

  4. JQ的表单验证

    (function () { $("#but").click(function () { if ($("#name").val() == "" ...

  5. Vue基本应用

    1.  returnDetail.$mount('#returnDetail');  不用el 直接可以绑定数据到页面的id上 作用区域不能交叠多个vue 实体 否则后面的vue 实体会失效. 2. ...

  6. 基于Nuclear的Web组件-Todo的十一种写法

    刀耕火种 刀耕火种是新石器时代残留的农业经营方式.又称迁移农业,为原始生荒耕作制. var TodoApp = Nuclear.create({ add: function (evt) { evt.p ...

  7. 2D动画的制作

    通过css3的transform  transition可以实现平移,旋转,缩放,拉伸等效果 1.缩放 -webkit-transform: scale(1); -moz-transform: sca ...

  8. JavaScript 数据属性和访问器属性

    在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...

  9. Android任务栈的运行规律

    一:前台栈表示应用A,后台栈则是应用B 前台栈/taskAffinity/launchMode 后台栈/taskAffinity/launchMode ActivityB/com.lpn.teston ...

  10. 微信Swift完整项目应用源码

    TSWeChat 中文说明 A WeChat alternative, written in Swift. 运行环境 Cocoapods 0.39.0 + iOS 8.0+ / Mac OS X 10 ...