`
liaofeng_xiao
  • 浏览: 126033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JS对象类型的确定

阅读更多
JS是松散类型的语言,这一点JS的对象表现得尤为突出。那么如何来确定JS对象的具体类型呢?

首先,我们可以使用typeof运算符确定其基本类型(number,object,function,undefined)。如果typeof运算符返回object我们再使用instanceof来确定该对象是否属于某个具体类型。

注意:typeof null得到object,而typeof undefined得到undefined,typeof 数组对象得到object,typeof 函数得到function。

o instanceof Type:判断对象o是否属于Type类型,如果o是Type类型子类的实例,同样满足。比如
var o=[];
alert(o instanceof Array);//true
alert(o instanceof Object);//true
var f=function(){}
alert(f instanceof Function);//true
alert(f instanceof Object);//true


如果要判断一个对象是否为某个具体类(子类)的实例,可以看该对象的constructor属性。
var d=new Date();
alert(d instanceof Object);//true
alert(d.constructor==Object);//false
alert(d.constructor==Date);//true


使用instanceof和constructor进行类型判断的缺点就是:你只能根据已经知道的类进行测试对象,而无法检查位置的对象。Object定义的默认的toString()方法的一个有趣现象在于它会揭示关于对象类型的信息。ECMAScript规范要求这个默认的toString()方法总是返回形式如下的一个字符串:
[object class]
class是对象的内部类型,通常和该对象的构造函数的名字相对应。例如,数组对象的class是Array,函数的class是Function,Date对象的class是Date,Math对象的class是Math。对于用户自定义的类型,class是Object,客户端的JS对象的class可能是Window、Document、Form等……

但是大多数类覆盖掉了默认的toString方法,需要Object.prototype中显示的调用默认函数,并且使用apply()所感兴趣的对象上调用:
Object.prototype.toString.apply(o);
        var d=new Date();
    	alert(Object.prototype.toString.apply(d));//[object Date]
    	var a=[];
    	alert(Object.prototype.toString.apply(a));//[object Array]


用于获得对象类型的工具方法
function getType(x){
	if(x==null){
		return "null";
	}
	var t= typeof x;
	if(t!="object"){
		return t;
	}
	var c=Object.prototype.toString.apply(x);
	c=c.substring(8,c.length-1);
	if(c!="Object"){
		return c;
	}
	if(x.constructor==Object){
		return c
	}
	if("classname" in x.prototype.constructor
			&& typeof x.prototype.constructor.classname=="string"){
		return x.constructor.prototype.classname;
	}
	return "<unknown type>";
}




分享到:
评论
1 楼 yanhaijing 2015-01-18  
if("classname" in x.prototype.constructor 
            && typeof x.prototype.constructor.classname=="string"){ 
        return x.constructor.prototype.classname; 
    }
这个代码有误吧

相关推荐

    javascript常用对象梳理

    JS中的常用对象[转载]web 技术 2010-06-05 15:00:30 阅读3 评论0 字号:大中小 订阅 [removed] Window For JavaScript 熟练window对象的open、close、alert、confirm、prompt、setTimeout、clearTimeout、...

    js确定对象类型方法

    再读《JavaScript权威指南》(犀牛书)9.7确定对象类型 之摘录

    javascript完全学习手册1 源码

    3.1 JavaScript对象概述 43 3.1.1 对象的概念 43 3.1.2 使用JavaScript对象 基础知识 44 3.2 Array对象 46 3.2.1 创建Array对象 46 3.2.2 Array对象属性 47 3.2.3 Array对象方法 48 3.3 String对象 51 3.3.1 创建...

    JavaScript数据类型之基本类型和引用类型的值

    在将一个值赋给变量时,解析器必须确定这个值是基本类型还是引用类型。基本类型包括如Undefined、Null、Boolean、Number和String,这5种基本类型数据类型是按值访问的,因此可以操作保存在变量中的实际的值;引用...

    javascript完全学习手册2 源码

    3.1.2 使用JavaScript对象基础知识 3.2 Array对象 3.2.1 创建Array对象 3.2.2 Array对象属性 3.2.3 Array对象方法 3.3 String对象 3.3.1 创建String对象 3.3.2 String对象属性 3.3.3 String对象方法...

    源文件程序天下JAVASCRIPT实例自学手册

    4.2 JavaScript对象的生成 4.2.1 HTML文档结构 4.2.2 DOM框架 4.2.3 顶级对象之间的关系 4.2.4 浏览器载入文档时对象的生成 4.3 JavaScript核心对象 4.4 文档对象的引用 4.4.1 通过对象位置访问文档对象 4.4.2 通过...

    JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析

    本文实例讲述了JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别。分享给大家供大家参考,具体如下: ...引用数据类型:也就是对象类型Object type,比如:Object 、Array 、Function 、Data等 基

    Javascript数组操作高级心得整理

    (1) JavaScript对象也是有属性和方法的 15  对象属性的使用 15  对象方法的使用 15 (2) 对象的定义与实例化 15 (3) 对象的作用域 16  JavaScript对象只有公用作用域 16  JavaScript对象没有静态作用域 16 ...

    searchjs:一个用于基于类似于json SQL的语言jsql过滤JavaScript对象的库

    jsql始终是一个JavaScript对象: {} ,具有确定查询参数的属性。 查询具有三种属性: 基元:基元匹配“或”或“或”上的一个或多个字段,带或不带负号。 修饰符:修饰符确定其他属性的处理方式:否定,字段联接...

    JavaScript基础和实例代码

    4.2 JavaScript对象的生成 4.2.1 HTML文档结构 4.2.2 DOM框架 4.2.3 顶级对象之间的关系 4.2.4 浏览器载入文档时对象的生成 4.3 JavaScript核心对象 4.4 文档对象的引用 4.4.1 通过对象位置访问文档对象 4.4.2 通过...

    js创建对象几种方式的优缺点对比

    比较js中创建对象的几种方式 1.工厂模式 function createObj(name, sex){ var obj = new Object();...缺点:①无法确定对象的类型(因为都是Object)。  ②创建的多个对象之间没有关联。  2.构造函数 func

    JavaScript各类型的关系图解

    2、引擎扩展对象是一个并不太大的集合,一般来说比较确定,它们也属于引擎的原生对象(但不属于ECMA规范的原生对象)。 3、宿主对象不是引擎的原生对象,而是由宿主框架通过某种机制注册到JavaScript引擎中的对象。

    JavaScript笔记

    |--“==”为确定两个运算数是否相等,“==”运算符会进行类型转换。转换后运算数相等就返回true,否则返回false |--“===”不执行类型转换,即,只有在无需类型转换运算数就相等的情况下,才返回true,否则返回...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    13.4.1 JavaScript对象 202 13.4.2 Web页面控件 204 13.4.3 声音播放器 205 13.4.4 电影播放器 205 13.4.5 Flash 206 13.5 分布式对象和企业 206 13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web...

    javascript学习手册.zip

    变量和数据类型:JavaScript是一种弱类型语言,变量的类型会在赋值时自动确定。常见的数据类型包括数字(Number)、字符串(String)、布尔值(Boolean)、对象(Object)、数组(Array)等。 运算符:JavaScript...

    大名鼎鼎SWFUpload- Flash+JS 上传

     在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发中,大部分的错误都是由于错误的设置和低劣的Event Handlers处理程序所造成的。 [编辑本段]文档中文翻译  ...

    ts-stream:类型安全的对象流,无缝支持背压,结束和错误处理

    它可以用作“普通” Javascript和TypeScript中Node的对象模式流的可靠且易于使用的替代方法。 特征: 类型安全(TypeScript) Promisified接口(使用原生的承诺,用如有必要) 易于实现具有错误处理和背压的流错误...

    javascript创建对象—类,继承

    javascript本身,是没有类的概念的,只有对象的概念,除了基本类型(string,number,boolean,null,undefined)外,其余均是对象,就连function也是对象.那么,什么是对象?!javascript中的对象,类似于一组键值对的集合.你...

    JavaScript内核系列

    动态性是指,在一个Javascript对象中,要为一个属性赋值,我们不必事先创建一个字段,只需要在使用的时候做赋值操作即可,如下例: Js代码 1. //定义一个对象 2. var obj = new Object(); 3. //动态创建...

Global site tag (gtag.js) - Google Analytics