确定Javascript对象是“复杂”对象还是仅仅是字符串

时间:2010-07-22 10:15:34

标签: javascript jquery string object

我希望能够传递字符串文字,

'this is a string'

或javascript对象,

{one: 'this', two: 'is', three: 'a', four: 'string' }

作为函数的参数,并根据它是字符串还是对象采取不同的操作。我如何确定哪个是真的?

具体来说,我想迭代对象的属性,如果属性是字符串则进行一些解析,但如果属性是对象则递归嵌套。我已经想出如何使用$.each()来迭代对象的属性,但是如果我只是用字符串做这个,它会将字符串作为一个字母数组而不是一个单独的东西来处理。我能以其他方式解决这个问题吗?

6 个答案:

答案 0 :(得分:6)

var data = {
    foo: "I'm a string literal",
    bar:  {
       content: "I'm within an object"
    }        
};

<强>的jQuery

$.each(data, function(i, element){
    if($.isPlainObject(element){
       // we got an object here
    }
});

jQuery lib中有类似$.isArray()$.isFunction()的方法。

原生Javascript

for(var element in data){
   if(toString.call(element) === '[object Object]'){
      // we got an object here
   }
}

hack'ish方式与toString一起使用有一个优势,即您可以确定它是really对象还是array。对象和数组都将使用object返回typeof element

长话短说,您无法依靠typeof运算符来区分真objectsarrays。为此,您需要toString.call()。如果您只是需要知道它是否是任何对象,typeof就可以了。

答案 1 :(得分:5)

var a = 'this is a string';

console.log(typeof a);   // Displays: "string"

var b = {one: 'this', two: 'is', three: 'a', four: 'string' };

console.log(typeof b);   // Displays: "object"

因此:

if (typeof yourArgument === 'string') {
   // Do the string parsing
}
else if (typeof yourArgument === 'object') {
   // Do the property enumeration
}
else {
   // Throw exception
}

<强>更新

进一步考虑:

  1. 请参阅下面的@Andy E's评论。

  2. typeof null也会返回"object"。这同样适用于任何其他对象,包括数组。

答案 2 :(得分:4)

试试这个:

function some_function(argument) {
  if (typeof(argument) == "string" || argument.constructor == String) {
    // it's a string literal
  } else if (argument && typeof(argument) == "object" && argument.constructor != Array) {
    // it's an object and not null
  } else {
    // error
  }
}

感谢Andy Eargument.constructor的tipp。

答案 3 :(得分:2)

尝试使用typeof运算符。对于对象,它将返回object,对于字符串,它将返回string

答案 4 :(得分:1)

你可以做这样的事情

function something(variableX){
  if (typeof(variableX) === 'object'){
     // Do something
  }else if (typeof(variableX) === 'string'){
     // Do something
  }

}

答案 5 :(得分:1)

我遇到了类似的问题,我想我找到了一个解决方案。以下是我感兴趣的任何人的示例代码。

var propToDotSyntax = function (obj) {
    var parse = function (o, n) {
        var a = [], t;
        for (var p in o) {
            if (o.hasOwnProperty(p)) {
                t = o[p];
                if (n !== undefined) tmp = n + '.' + p;
                else tmp = p;
                if (t && typeof(t) === 'object') a.push(arguments.callee(t, tmp));
                else a.push(tmp + '=' + t);
            }
        }
        return a;
    };
    return parse(obj).toString();
}
var i = { prop: 'string', obj: { subprop: 'substring', subobj: { subsubprop: 'subsubstring' } } };

propToDotSyntax(i);

这将遍历对象的所有属性 - 即使属性本身就是对象 - 并以点语法返回具有以下值的字符串。

"prop=string,obj.subprop=substring,obj.subobj.subsubprop=subsubstring"

我从DavidPirek.com获得灵感 - 谢谢Pirek先生!