Я хочу смочь передать любого строковый литерал,
'this is a string'
или объект JavaScript,
{one: 'this', two: 'is', three: 'a', four: 'string' }
как аргумент функции, и принимают различные меры в зависимости от того, является ли это строкой или объектом. Как я определяю, который верен?
Чтобы быть конкретным, я хочу выполнить итерации по свойствам объекта и сделать некоторый парсинг, если свойство является строкой, но вложенное множество рекурсивно, если свойство является объектом. Я выяснил, как использовать $.each()
для итерации по свойствам объекта, но если я просто делаю это со строкой, она рассматривает строку как массив букв, а не как единственная вещь. Я могу обойти этот некоторый другой путь?
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
вполне подойдет.
Попробуйте следующее:
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
.
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"
. То же самое относится и к любому другому объекту, включая массивы.
Попробуйте оператор typeof. Он вернет object
для объектов и string
для строк.
вы можете сделать что-то вроде этого
function something(variableX){
if (typeof(variableX) === 'object'){
// Do something
}else if (typeof(variableX) === 'string'){
// Do something
}
}