What is the shortest way to check if two or more variables are equal to 0 in JavaScript?
I'm curious to know if there's something shorter than if(!x&&!y&&!z){...}.
(EDIT: This first part refers to the original phrasing of the question.)
First, (!x&&!y&&!z) returns a boolean, which makes ?true:false entirely redundant. It's basically like using
if (x == true) return true; else if (x == false) return false; instead of return x;.
That gives you
!x&&!y&&!z (EDIT: The remainder still applies to the new version of the question.)
Now you could apply De Morgan's law. The above is equivalent to
!(x||y||z) Which is the same length for 3 variables and longer for 2 variables. But for each variable beyond the third, you save one more character!
Lastly, if you know that your variables are numbers, you can also use the bitwise operator, i.e.
!(x|y|z) If you actually need booleans (which I assume from your snippet), this doesn't work for the & case, because !x&!y&!z will give you an integer. Then again, in JavaScript it's often enough to have truthy or falsy values, in which case, that's a perfectly valid option.
Bonus tip: if you ever want to turn a truthy/falsy value (like a non-zero/zero number) into a boolean, don't use x?true:false either, but use !!x instead. !x is a boolean with the opposite truthiness/falsiness than x, so !!x is true for x truthy and false for x falsy.
Just an addendum.
In the special case where the block contains just a procedure call, you can replace
if(!x&&!y&&!z){call();} by
x||y||z||call(); This function is obviously not the shortest until you have a lot of numbers to check (the poster did say "or more"). It verifies that all arguments are equal to zero.
function AllZero() { var args = Array.prototype.slice.call(arguments); args.push(0); return Math.min.apply(Math,args) === Math.max.apply(Math,args); } If you push a different number in the args.push(x) line, it will check that all of the arguments are equal to that number.
AllZero('', '', '') \$\endgroup\$
!(x|y|z)work? \$\endgroup\$