То есть if (obj.one) {} для того, чтобы проверить "Если есть в объекте one" не подходит.
Поэтому для проверки наличия ключа в объекте используется именно Object.hasOwnProperty. Можно конечно использовать его так
var obj = {
one: true,
...objData,
};
if (obj.hasOwnProperty('one')) {}
но тогда всё сломается для объектов вроде
{
one: true,
hasOwnProperty: 'foo',
}
Поэтому достаточно оптимальным и надёжным способом является именно Object.hasOwnProperty.call(object, property).
Если парень не знает азов, а я ему пихаю hasOwnProperty.call/lodash
Да не, не пихаю если честно :)
Во-первых hasOwnProperty и call и есть те самые "азы", с которыми необходимо разобраться прежде чем использовать сравнения с приведением типа (if (obj.one) {} именно такой и является).
Во-вторых lodash я предложил потому, что конструкция Object.hasOwnProperty.call действительно выглядит пугающе. Да и в реальных проектах очень часто используются всякие lodash, underscore и прочие.
Условие должно быть не с И, а с ИЛИ
В таком случае достаточно одной проверки if (obj.one) {}. Потому что любое значение obj удовлетворяющее условию if (obj.one) {} не удовлетворяет условию if (obj.one !== false) {}.
Резюмируя
1. if (obj.one) {} может подойти в ограниченном количестве случаев, но нужно быть предельно осторожным при использовании таких проверок. Как только вы присвоите obj.one любое falsy значение (0, '', NaN, null, undefined) проверка сработает не так, как задумывалось.
2. Постарайтесь избегать хранения разных типов данных в одних и тех же переменных/свойствах объекта. Это также позволит сделать код более предсказуемым, а проверки простыми. Да JavaScript это позволяет, но появление таких инструментов как TypeScript и Flow ясно говорит о том, что в больших проектах с большими командами динамическая типизация приносит больше проблем, чем пользы.
3. Разберитесь в основах языка. В частности, как именно работает неточное сравнение и к каким проблемам может может приводить неосторожное использование.
const check = value => Object.hasOwnProperty.call(value, 'one') && value.one !== false;
check({}); // false, one нет в объекте - всё верно
check({ one: undefined }); // true, one есть в объекте и он не равен false - всё верно
check({ one: true }); // true, one есть в объекте и он не равен false - всё верно
check({ one: false }); // false, one есть в объекте, но он равен false - всё верно