Определение, является ли объект JavaScript “сложным” объектом или просто строкой

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

'this is a string'

или объект JavaScript,

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

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

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

7
задан Tomas Aschan 22 July 2010 в 10:15
поделиться

5 ответов

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 имеет то преимущество, что вы можете определить, действительно ли это объект и массив . И объекты, и массивы вернут объект , используя typeof element .

Короче говоря, вы не можете полагаться на оператор typeof , чтобы различать истинные объекты и массивы . Для этого вам понадобится toString.call () . Если вам просто нужно знать, является ли это каким-либо объектом, typeof вполне подойдет.

6
ответ дан 6 December 2019 в 09:57
поделиться

Попробуйте следующее:

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

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

4
ответ дан 6 December 2019 в 09:57
поделиться
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". То же самое относится и к любому другому объекту, включая массивы.

5
ответ дан 6 December 2019 в 09:57
поделиться

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

2
ответ дан 6 December 2019 в 09:57
поделиться

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

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

}
1
ответ дан 6 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: