Определение, является ли объект Javascript «сложным» объектом или просто строкой - PullRequest
7 голосов
/ 22 июля 2010

Я хочу иметь возможность передавать либо строковый литерал,

'this is a string'

или объект javascript,

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

в качестве аргумента функции, и выполнять различные действия в зависимости отбудь то строка или объект.Как определить, что является истинным?

Чтобы быть точным, я хочу перебрать свойства объекта и выполнить некоторый анализ, если свойство является строкой, но рекурсивно вкладывать, если свойство является объектом.Я выяснил, как использовать $.each() для перебора свойств объекта, но если я просто сделаю это со строкой, она будет обрабатывать строку как массив букв, а не как одну вещь.Могу ли я обойти это другим способом?

Ответы [ 6 ]

6 голосов
/ 22 июля 2010
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 просто отлично.

5 голосов
/ 22 июля 2010
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".То же относится и к любому другому объекту, включая массивы.

4 голосов
/ 22 июля 2010

Попробуйте:

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
  }
}

Спасибо Энди E за подсказку с argument.constructor.

2 голосов
/ 22 июля 2010

Попробуйте оператор typeof .Он вернет object для объектов и string для строк.

1 голос
/ 05 января 2011

У меня была похожая проблема, и я думаю, что нашел решение.Вот мой пример кода для всех, кто интересуется.

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 - Спасибо, мистер Пирек!

1 голос
/ 22 июля 2010

вы можете сделать что-то вроде этого

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...