Список значений, у которых нет свойств, довольно короткий: undefined
и null
. Тестирование для них должно быть простым (value == null
).
Обратите внимание, что все другие примитивы могут иметь свойства (через бокс), но поскольку объект в штучной упаковке теряется немедленно, нет смысла добавлять свойства к ним:
1..test = 1;
"test".test = 1;
Infinity.test = 1;
NaN.test = 1;
true.test = 1;
Symbol().test = 1;
1n.test = 1;
Чтобы проверить наличие не примитивов, можно использовать typeof value === "object"
, но, поскольку null
также является объектом (очень особенным, фактически он считается примитивом, но typeof
об этом говорит), вы должны явно проверьте value !== null
.
Хотя вы обычно можете добавлять свойства к объектам, они могут быть заморожены, тогда добавление свойств бесполезно, то же самое относится и к прокси.
const obj = {};
Object.freeze(obj);
obj.test = 1;
console.log(obj.test);
И поскольку Прокси не могут быть обнаружены, нет способа узнать, можно ли добавить свойство или нет.