我希望能够传递字符串文字,
'this is a string'
或javascript对象,
{one: 'this', two: 'is', three: 'a', four: 'string' }
作为函数的参数,并根据它是字符串还是对象采取不同的操作。我如何确定哪个是真的?
具体来说,我想迭代对象的属性,如果属性是字符串则进行一些解析,但如果属性是对象则递归嵌套。我已经想出如何使用$.each()
来迭代对象的属性,但是如果我只是用字符串做这个,它会将字符串作为一个字母数组而不是一个单独的东西来处理。我能以其他方式解决这个问题吗?
答案 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
运算符来区分真objects
和arrays
。为此,您需要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
}
<强>更新强>
进一步考虑:
请参阅下面的@Andy E's评论。
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 E与argument.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先生!