javascript检查字典

ary*_*yan 7 javascript

我有一个简单的程序,如:

var a = {'a': 1, 'b': 2}
console.log(a)
console.log(a instanceof Array)
console.log(a.constructor instanceof Array)
Run Code Online (Sandbox Code Playgroud)

这里的价值a是字典.我想检查一下.

我怎样才能检查javascript.我上面的两个测试都给了我错误的价值

我是javascript的新手

kof*_*fus 8

function isDict(v) {
    return typeof v==='object' && v!==null && !(v instanceof Array) && !(v instanceof Date);
}
Run Code Online (Sandbox Code Playgroud)

  • 这并非在所有情况下都能正常工作。如果输入是RegExp,则输出为true而不是false。 (2认同)

jfr*_*d00 7

该结构{'a': 1, 'b': 2}是一个 Javascript 对象。它可以像字典一样使用,但Map 对象更接近大多数人所认为的字典。

console.log(typeof a);            // "object"
console.log(Array.isArray(a));    // false, because it's not an array
Run Code Online (Sandbox Code Playgroud)

如果您想知道某物是否是数组,请使用:

Array.isArray(a)
Run Code Online (Sandbox Code Playgroud)

如果您想知道某物是否是对象,请使用:

typeof a === "object"
Run Code Online (Sandbox Code Playgroud)

但是,您必须小心,因为数组也是一个对象。


如果你想知道某个东西是否是普通对象,你可以看看 jQuery 是如何检测普通对象的:

isPlainObject: function( obj ) {
    // Not plain objects:
    // - Any object or value whose internal [[Class]] property is not "[object Object]"
    // - DOM nodes
    // - window
    if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
        return false;
    }

    // Support: Firefox <20
    // The try/catch suppresses exceptions thrown when attempting to access
    // the "constructor" property of certain host objects, ie. |window.location|
    // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
    try {
        if ( obj.constructor &&
                !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
            return false;
        }
    } catch ( e ) {
        return false;
    }

    // If the function hasn't returned already, we're confident that
    // |obj| is a plain object, created by {} or constructed with new Object
    return true;
},
Run Code Online (Sandbox Code Playgroud)


Flo*_*oyd 5

检查某种东西是否是Javascript中的字典的最简单方法是,在给定数组的情况下也不会返回true

if (a.constructor == Object) {
    // code here...
}
Run Code Online (Sandbox Code Playgroud)

这是受到这里答案的启发。

  • 艾伦,“a.constructor.name == 'Object'”与“a.constructor == Object”相比有什么优势? (3认同)