Есть много хороших общих ответов, однако учтите следующее:
Итак, вместо этого я рассмотрю некоторые конкретные случаи.Во-первых, я обычно начинаю с:
function f (x) {
x = x || {} // so f() will be accepted as per f({})
...
}
Это также устанавливает контекст для следующего:
Мой обычный подход - просто проверить значение true-y.Истинное значение означает «поставлено».Однако этот недостаток заключается в том, что 0 или '' не считаются "поставленными".
if (x.id) {
// x.id is any truth-y
}
Если 0 является допустимым входным сигналом, тогда я расширяю проверку, так что не undefined
значения считаются "поставленными",Неустановленное свойство по умолчанию всегда имеет значение undefined
.(Этот метод будет принимать все значения true-y и false-y, такие как 0, "" и null
).
if (x.id !== undefined) {
// x.id is all truth-y and all-but-undefined false-y
}
Если undefined
является допустимым входом (, которыйЯ бы категорически против ), тогда проверка может основываться на hasOwnProperty
.Это имеет тот недостаток, что не проверяет цепочку [[prototype]]
.
if (x.hasOwnProperty("id")) {
// x.id set to something, including undefined
}
Конструкция for(..in..)
также может использоваться для перебора свойств объекта (включая свойства в [[prototype]]
).если они специально не спрятаны).Тем не менее, для общего случая работы с вводом (например, без создания библиотеки JSON), я считаю, что просто и чисто разобраться со свойствами входного объекта (объектов) одним из методов, описанных выше.