|| is operated like this: starting from the first one, if it encounters a meaningful return, otherwise it returns the last expression (note that it is not necessarily a Boolean value);
&& is operated like this: starting from the first At the beginning, a meaningless return is encountered, otherwise the last expression is returned (note the same as above);
! is operated like this: negate the value of the expression (note not the expression).
What is meaningless: the following six: 0, null, undefined, "", false, NaN. Otherwise, it makes sense.