Это сводится к приоритету оператора в JS вместе с тем, как на самом деле работает оператор "или" ||
.
Во-первых, оператор ===
более прецедентен, чем ||
- см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence. Таким образом, ваш оператор if
анализируется как if ((obj === undefined) || {})
- что, я подозреваю, уже противоположно тому, как вы хотели его интерпретировать. , Но это не единственное.
obj === undefined
, очевидно, выйдет как false
(только undefined
- это ===
- undefined
, и я предполагаю, что ваш props.data
действительно передан) - так, что оценивается как ( приведение к логическому значению пустого объекта {}
. И это true
, потому что все объекты, даже пустой, правдивы в JS.
Вот почему ваш оператор console.log
всегда выполняется и всегда печатает полный объект props.data
.
То, что вы, вероятно, хотели проверить, это: if ((obj === undefined) || (obj === {}) )
. Проблема в том, что теперь это всегда будет false
(при условии, что вы действительно передаете объект как props.data
) из-за того, как в JS работает сравнение на равенство объектов. (Использование ==
здесь также не поможет, поскольку оно ведет себя идентично ===
, если оба операнда являются объектами.)
Итак, что вы действительно хотите сделать, это проверить, является ли obj
пустым объектом или нет, и, к сожалению, нет простого способа сделать это. Но об этом, конечно, уже спрашивали на SO, например. здесь: Как мне проверить пустой объект JavaScript?