`
robinqu
  • 浏览: 90264 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JavaScript 判定对象类型

阅读更多
判定JS的对象类型基本是MISSION Impossible。
JS的对象可能是JS核心对象、可能是自定义类、可能是空等等,但是其弱类型机制又无法有什么很准确的方法来判定这个对象到底是什么,特别是当这个东西是有继承的……

引用
typeof is useful primarily for distinguishing primitive types from objects. There are a few quirks to typeof. First, remember that typeof null is "object", while typeof undefined is "undefined". Also, the type of any array is "object" because all arrays are objects. However, the type of any function is "function", even though functions are objects, too.


typeof运算符是JS中主要的判定方式,但它很怪癖:

typeof null         // Yields "obejct"
typeof undefined    // yields "undefined"
typeof array_var    // array_var represents an array variable; yields "object"
typeof function_var // function_var represents an function variable; yields "function"


再接着就是instanceof了

x instanceof Array

引用

The left side of instanceof is the value to be tested, and the right side should be a constructor function that defines a class.


上面这个语句中,JS会测试这句话的左值,右值是一个构造函数;任何这个类的实例或这个类父类的实例都会返回ture

假设f是一个Function,以下表达式都是ture
typeof f == "function"
f instanceof Function
f instanceof Object


引用
If you want to test whether an object is an instance of one specific class and not an instance of some subclass, you can check its constructor property.


如果你想确定一个对象是一个确定类的实例,而不是其子类的实例,你必须比较这两个对象的构造函数:

var d = new Date( );                     // A Date object; Date extends Object
var isobject = d instanceof Object;     // evaluates to true
var realobject = d.constructor==Object; // evaluates to false


Object.toString( ) for Object Typing
百年不用的toString()方法

引用
A useful trick that uses the default implementation of the Object.toString( ) method can help in this case.


An interesting feature of the default toString( ) method is that it reveals some internal type information about built-in objects. The ECMAScript specification requires that this default toString( ) method always returns a string of the form:

[object
class]

class is the internal type of the object and usually corresponds to the name of the constructor function for the object.

arrays have a class of "Array", functions have a class of "Function", and Date objects have a class of "Date". The built-in Math object has a class of "Math", and all Error objects (including instances of the various Error subclasses) have a class of "Error". Client-side JavaScript objects and any other objects defined by the JavaScript implementation have an implementation-defined class (such as "Window", "Document", or "Form").

Objects of user-defined types, such as the Circle and Complex classes defined earlier in this chapter, always have a class of "Object", however, so this toString( ) technique is useful only for built-in object types.


Object默认的toString()方法,根据ECMAScript的标准,会返回一些必要的信息,格式如下:
[object class]
class是一个对象的内部类型,通常是其构造函数的名字。

数组对象的class值为“Array”;函数对象的class值为“Function”;日期对象Date的class值为“Date”;Math对象的class值为“Math”;Error(包括其任何子类)对象的class值为“Error”。
而客户端对象都有相应的class值,像Window、Document、Form等等。

用户自定义对象,只有一个“Object”的class值,所以toString()其实也只对内建对象有效。

下面根据以上思想,编写一个增强型的类型判断函数:

function getType(x) {
    // If x is null, return "null"
    // x是null,返回“null”
    if (x == null) return "null";

    // Next try the typeof operator
    // 先用基础的typeof判定
    var t = typeof x;
    // If the result is not vague, return it
    if (t != "object")  return t;

    // Otherwise, x is an object. Use the default toString( ) method to
    // get the class value of the object.
    // 对于object对象,typeof无能为力,我们来找找对象的class值
    var c = Object.prototype.toString.apply(x);  // Returns "[object class]"
    c = c.substring(8, c.length-1);              // Strip off "[object" and "]"

    // If the class is not a vague one, return it.
    // 如果有具体的class值,而不是单纯的“object"
    if (c != "Object") return c;

    // If we get here, c is "Object".  Check to see if
    // the value x is really just a generic object.
    // 函数运行到这里,那么该对象就是一个Object
    if (x.constructor == Object) return c;  // Okay the type really is "Object"
    // For user-defined classes, look for a string-valued property named
    // classname, that is inherited from the object's prototype
    // 也有可能是自定义类,我们找一下它的构造函数中是否定义了classname这个属性
    if ("classname" in x.constructor.prototype &&  // inherits classname
        typeof x.constructor.prototype.classname == "string") // its a string
        return x.constructor.prototype.classname;

    // If we really can't figure it out, say so.
    return "<unknown type>";
}

分享到:
评论

相关推荐

    JavaScript数据类型判定的总结笔记

    首先,作者指出JavaScript自带两套类型系统:基本数据类型和对象类型。基本数据类型包括了`undefined`、`string`、`null`、`boolean`、`number`以及`function`,而对象类型主要是指除基本类型之外的所有数据,如数组...

    Javascript考试题目选择题.doc

    知识点:javascript变量,基本数据类型,alert()函数的使用。 9. 将字串s中的所有字母变为小写字母的方法是s.toLowerCase()。 知识点:javascript字符串操作,toLowerCase()方法的使用。 10. 以下表达式产生一个0...

    教学进度表-Javascript程序设计.docx

    JavaScript 的高级应用,涵盖了 JavaScript 的基础知识、JavaScript 的实现、JavaScript 小体验、JavaScript 环境搭建、JavaScript 类型、JavaScript 变量和关键字、条件语句、循环语句、函数、对象、BOM 基础函数...

    107个常用Javascript语句.doc

    7. Javascript中的数据类型:包括String、Number、Boolean、Null、Object、Function等六种数据类型。 8. 字符串转换数字:可以使用parseInt()和parseFloat()函数将字符串转换为数字。 9. 数字转换字符串:可以使用...

    107个常用Javascript语句

    JavaScript 中的数据类型分为基本类型和复杂类型: - **基本类型**:包括 `String`、`Number`、`Boolean`、`Null`、`Undefined`。 - **复杂类型**:`Object` 和 `Function`。 #### 8. 字符型转换成数值型 - `...

    javaScript练习题.docx

    JavaScript 练习题汇总 JavaScript 是一种广泛应用于 web ...这些练习题涵盖了 JavaScript 的基础语法、变量、数据类型、运算符、控制结构、函数、数组、对象等多方面的内容,对于初学者和专业开发者都有参考价值。

    javascript_api

    表示数值数据类型和提供数值常数的对象。 Number 对象 提供所有的 JScript 对象的公共功能。 Object 对象 存储有关正则表达式模式查找的信息。 RegExp 对象 包含一个正则表达式模式。 正则表达式对象 提供对文本...

    水果忍者 网页版 JavaScript代码.zip

    2. 水果类:创建水果对象,包含水果的类型、位置、速度等属性,并实现水果的生成、移动和消失逻辑。 3. 刀类:定义刀的轨迹和碰撞检测,当刀与水果相交时,执行相应的得分或失败处理。 4. 用户交互:监听用户的鼠标...

    判定对象是否为window的js代码

    首先,我们可以尝试使用`Object.prototype.toString.call()`方法来检测对象的类型。这个方法会返回一个表示该对象内部类的字符串,例如`"[object Array]"`或`"[object Function]"`。当用于`window`对象时,不同的...

    javaScript笔试常考题

    7. JavaScript值类型:包括`String`, `Number`, `Boolean`, `Null`, `Undefined`, `Object`, `Symbol`(ES6新增), `BigInt`(ES10新增)。在这里提到了`Function`,但它在ECMAScript规范中被分类为`Object`的一种。 8....

    基于JavaScript的植物大战僵尸版源码

    JavaScript是一种解释型、弱类型的脚本语言,主要应用于客户端的网页开发,通过浏览器执行。它支持事件驱动、函数式以及基于原型的编程风格。在HTML和CSS的基础上,JavaScript可以创建丰富的用户交互体验。 在这个...

    通过Xml定制来完成对输入的判定

    在我们的场景中,我们可以定义一个XSD文件,其中包含各种输入判定规则,如长度限制、数据类型、格式要求等。 2. **解析XML**:在应用程序中,我们需要解析XML文件,将XML数据转化为程序可以理解的对象。这可以通过...

    js代码-判断对象数组是否含有某个对象

    首先,我们要明白JavaScript中的对象是引用类型,这意味着当你在数组中添加一个对象时,你实际上是在存储该对象的引用。因此,简单的`indexOf`或`includes`方法可能无法有效地检查对象数组,因为它们基于严格相等性...

    javaScript脚本游戏学习,看懂了这个游戏就没有什么脚本你解决不了了

    JavaScript的基础包括变量声明(var, let, const)、数据类型(如字符串、数字、布尔、对象、数组)以及控制流程(条件语句、循环)。在游戏开发中,变量用于存储各种状态信息,如玩家的位置、分数等;数据类型则...

    Simple Board Game(Chess) in JavaScript Free Source Code.zip

    每个棋子对象包含位置信息和其他属性,如颜色、类型等,而棋盘结构用于记录棋局状态。 在用户界面方面,JavaScript可以结合HTML和CSS来创建游戏界面。HTML用于构建基本的布局框架,CSS用于美化界面,而JavaScript...

    JavaScript复习资料

    7. **值类型**:JavaScript中的基本数据类型包括 `String`、`Number`、`Boolean`、`Null`、`Undefined`,以及对象类型 `Object`、`Function`。 8. **类型转换**:`parseInt()` 和 `parseFloat()` 用于将字符串转换...

    javascript文档

    javascript的官方文档 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有对该主题...

Global site tag (gtag.js) - Google Analytics