`

javascript判断 对象 类型

阅读更多

/**
 * 返回一个对象的类型
 */
function getType(x) {
    //不能!x,因为"",0,false
    if (null == x)
        return "null";

    //注意:typeof对j引用类型对返回object
    var t = typeof x;
    if (t != "object")return t;

    //有的对象可能重写了toString方法,所以需要调用对象最原始的toString()
    var s = Object.prototype.toString.call(x),
            s = s.substring(8, s.length - 1);

    //注意:==“Object”的时候需要判断具体的类型。
    if (s != "Object")return s;

    var x_constructor = x.constructor;
    //x.constructor:即创建x对象的方法
    if (x_constructor == Object)return s;

    //一个对象的构造函数的原型对象中如定义有className属性(原本不存在的,这是用户您自己定义的属性),则返回这个属性的值
    //    function X(x,y,z){
    //        this.x=x;
    //    }
    //    X.prototype.className="X";
    //    var x=new X(1,2,3);
    //    alert(x.constructor.prototype== X.prototype)//return true.
    var x_cons_proto = x_constructor.prototype;
    if ("className" in x_cons_proto && typeof x_cons_proto.className == "string") {
        return x_cons_proto.className;
    }

    //返回构造函数的名称
    //但是只对于使用函数定义方式声明的函数有效,如:
    //function ClassA(){this.x="ss"}  var a=new ClassA(); alert(getType(a));
    if ("name" in x_constructor && "" != x_constructor.name)return x_constructor.name;

    /*下面都是闭包的情况*/
    //对与调用Function构造的方式创建的对象,则
    var c = x_constructor.toString(), c = c.substring(8, c.indexOf("(")).replace(/(^\s*)|(\s*$)/g, "");
    //对于new方法直接量方式创建的对象,则暂时无能为力
    if ("" == c) {
        return  "The object created by a anonymous function.";
    }

    return c;
}

/**
 * 测试
 */
var printFunc = function() {
    //--------------------------------------------------------------
    //--------------------------------------------------------------
    var k;                     //<br>
    document.writeln(getType(k));
    k = "";
    document.writeln(getType(k));
    k = 23;
    document.writeln(getType(k));
    k = true;
    document.writeln(getType(k));
    k = new Date();
    document.writeln(getType(k));
    k = /\s/;
    document.writeln(getType(k));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");

    //--------------------------------------------------------------
    //--------------------------------------------------------------
    function Outer(x) {
        var x = x;
        //... ...
        return function() {
            return x;
        }
    }

    document.writeln(getType(Outer));
    var o = Outer(98);
    document.writeln(getType(o));
    var o = new Outer;
    document.writeln(getType(o));
    var o = new Outer(33);
    document.writeln(getType(o));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");

    //--------------------------------------------------------------
    //--------------------------------------------------------------
    function Outer2(x) {
        this.x = x;
        //... ...
        this.getX = function() {
            return x;
        }
    }

    document.writeln(getType(new Outer2(99)));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");

    //--------------------------------------------------------------
    //--------------------------------------------------------------
    function Outer3(x) {
        this.x = x;
        //... ...
        this.getX = function() {
            return x;
        }
        return x;
    }

    document.writeln(getType(new Outer3(92)));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");

    //--------------------------------------------------------------
    //--------------------------------------------------------------
    function MyClass(x, y) {
        this.x = x;
        this.y = y;
    }

    //MyClass.prototype.className = "MyClass"; //自定义一个属性,表示类型,则会提高执行效率
    //MyClass.prototype.constructor = MyClass;
    MyClass.prototype.getSum = function() {
        return this.x + this.y;
    };
    var mc = new MyClass(2, 5);

    document.writeln(mc.getSum());
    document.writeln(getType(mc));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");

    //--------------------------------------------------------------
    //--------------------------------------------------------------
    var MyClass3 = function(x, y) {
        this.x = x;
        this.y = y;
    }
    //MyClass.prototype.className = "MyClass";
    //MyClass.prototype.constructor = MyClass;
    MyClass3.prototype.getSum = function() {
        return this.x + this.y;
    };
    mc = new MyClass3(1, 5);

    document.writeln(mc.getSum());
    document.writeln(getType(mc));
    document.writeln("<br>");
    document.writeln("<br>");
    document.writeln("<br>");
    //--------------------------------------------------------------

    //--------------------------------------------------------------
    var MyClass2 = Function("x", "y", "this.x = x;this.y = y;");
    MyClass2.prototype.getSum = function() {
        return this.x + this.y;
    };
    mc = new MyClass2(3, 5);
    document.writeln(mc.getSum());
    document.writeln(getType(mc));
}


printFunc();

//document.writeln("<br>");
//document.writeln(printFunc);

分享到:
评论

相关推荐

    JavaScript中判断对象类型的几种方法总结

    JavaScript中判断对象类型的常见方法包括`typeof`运算符、`instanceof`运算符以及利用对象的`constructor`属性。每种方法都有其特定的应用场景和限制。 1. `typeof`运算符: `typeof`是一种一元运算符,用于检测...

    JavaScript判断浏览器类型及版本

    JavaScript 判断浏览器类型及版本 随着浏览器市场的日益繁荣,浏览器的类型和版本也越来越多,给前端开发带来了很大的挑战。如何精准地判断浏览器的类型和版本成为了前端开发中非常重要的一个问题。 JavaScript ...

    JavaScript面向对象的支持

    由于JavaScript的动态类型,往往采用“如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子”的原则,即关注对象的行为而非其类型,来判断对象是否符合某种模式。 10. **设计模式**: 尽管JavaScript的面向...

    京东2018秋招Web前端工程师笔试题及答案.pdf

    本资源摘要信息涵盖了Web前端工程师笔试题及答案,涉及到多个方面的知识点,包括Ajax技术、IFrame、CSS盒模型、浏览器端存储技术、JavaScript判断对象类型、排序算法、正则表达式、HTTP请求协议头等。 Ajax技术是...

    举例讲解如何判断JavaScript中对象的类型

    在JavaScript中,判断对象类型主要有两种操作符:`typeof` 和 `instanceof`。 `typeof`操作符用于判断JavaScript中的基本数据类型,包括:`number`、`string`、`boolean`、`object`、`function`、`undefined`,以及...

    JavaScript isArray()函数判断对象类型的种种方法

    使用`constructor`属性也是判断对象类型的一种方法。在JavaScript中,每个对象都有一个`constructor`属性,它指向创建该对象的构造函数。通过检查`arr.constructor == Array`可以判断`arr`是否为数组。但这种方法...

    javascript判断一个变量是数组还是对象

    我们能够使用typeof判断变量的身份,判断字符串得到string,数字和NaN得到number,函数会得到function等,但是判断数组,对象和null时都会得到object,详细请看js数据类型,这就是typeof的局限性,并不能准确的判断...

    JavaScript中判断变量是数组、函数或是对象类型的方法

    在JavaScript中,判断一个变量是否为数组、函数或者对象类型是一个经常需要处理的问题,尤其是在处理各种数据类型时。JavaScript提供了不同的方法来判断变量的类型,但是每种方法都有其适用场景和限制。 首先,...

    浅析JavaScript中的对象类型Object_.docx

    JavaScript中的对象类型Object是语言的核心组成部分,它不仅构成了所有复杂数据结构的基础,还扮演着全局对象的角色,提供了许多内置的方法和属性。在这个浅析中,我们将深入探讨Object类型及其相关特性。 首先,...

    JavaScript常用对象.md

    数组是一种特殊的对象类型,用于存储有序的元素集合。数组元素可以通过索引访问,索引是从 0 开始的整数。 ##### 创建数组 1. 使用 `Array` 构造函数: ```javascript var colors = new Array(); ``` 2. 使用...

    JavaScript判断浏览器类型及版本[归类].pdf

    本文将详细介绍如何利用JavaScript来判断浏览器的类型及其版本,以便于更好地解决不同浏览器之间的兼容性挑战。 首先,我们可以根据浏览器特有的属性或方法来识别浏览器类型。例如: 1. Internet Explorer(IE):...

    即用即查——JavaScript核心对象参考手册

    ### JavaScript核心对象参考手册知识点概览 #### 一、书籍基本信息 - **书名**:即用即查——JavaScript核心对象参考手册 - **作者**:韩延峰编著 - **ISBN**:978-7-115-16140-6 - **定价**:49元 - **出版时间**...

    Javascript如何判断数据类型和数组类型

    除了直接使用这些方法,我们还可以通过一些方法来判断对象的类型,例如: - 如果一个变量的typeof结果为"object",并且constructor等于Array,则这个变量是一个数组; - 如果一个变量的typeof结果为"object",并且...

    javascript检测对象中是否存在某个属性判断方法小结

    `hasOwnProperty()`是JavaScript对象的一个内置方法,它用于判断对象是否具有指定的自有属性,不考虑继承属性。例如: ```javascript var o = {x: 1}; o.hasOwnProperty("x"); // true,自有属性中有x o....

    JavaScript判断对象和数组的两种方法

    这篇文章介绍了两种判断对象和数组的方法,对于后端开发者来说,了解这些方法能够帮助前端开发者更好的消费接口数据,而对前端开发者而言,掌握这些知识能够使他们在处理数据时更加游刃有余。 方法一使用了...

    javascript 核心对象代码

    此外,`Array`还有静态方法,如`isArray()`用于判断一个对象是否为数组。 4. **对象和原型**:JavaScript采用基于原型的继承机制。每个对象都有一个`__proto__`属性,指向其构造函数的`prototype`。通过原型链,...

    JavaScript几何对象生成泰森多边形

    JavaScript提供了多种几何对象类型,如Point、LineString、Polygon等,用于构建复杂的地理空间结构。这些对象通常包含了位置坐标、属性信息以及几何形状的相关属性。 在iClient 3D产品系列中,JavaScript库提供了...

    JavaScript判断对象是否为数组

    文中为大家分享了三种JavaScript判断对象是否为数组的方法, 1. typeof 首先我们会想到的是使用typeof来检测数据类型,但是对于Function, String, Number, Undefined等这几种基本类型来说,使用typeof来检测都可以...

Global site tag (gtag.js) - Google Analytics