2

为了澄清我的标题,我需要一种方法来确定对象不是字符串、数字、布尔值或任何其他预定义的 JavaScript 对象。想到的一种方法是:

if(!typeof myCustomObj == "string" && !typeof myCustomObj  == "number" && !typeof myCustomObj == "boolean") {

我可以检查是否myCustomObj是一个对象,如下所示:

if(typeof myCustomObj == "object") {

但是,这仅适用于原始值,因为这typeof new String("hello world") == "object")是真的。

确定对象是否不是预定义的 JavaScript 对象的可靠方法是什么?

4

2 回答 2

5

这是 jQuery 在jQuery.isPlainObject()中的操作方式

function (obj) {
    // Must be an Object.
    // Because of IE, we also have to check the presence of the constructor property.
    // Make sure that DOM nodes and window objects don't pass through, as well
    if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
        return false;
    }

    try {
        // Not own constructor property must be Object
        if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
            return false;
        }
    } catch(e) {
        // IE8,9 Will throw exceptions on certain host objects #9897
        return false;
    }

    // Own properties are enumerated firstly, so to speed up,
    // if last one is own, then all properties are own.
    var key;
    for (key in obj) {}

    return key === undefined || hasOwn.call(obj, key);
}
于 2012-04-27T20:37:35.117 回答
4

您可以在对象原型上使用“toString”函数:

var typ = Object.prototype.toString.call( someTestObject );

这为内置类型提供了诸如“[object String]”或“[object Date]”之类的答案。不幸的是,您无法区分作为普通 Object 实例创建的事物和使用构造函数创建的事物,但从某种意义上说,这些事物并没有太大的不同。

于 2012-04-27T20:36:36.317 回答