7
\$\begingroup\$

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){...}.

\$\endgroup\$
10
  • 1
    \$\begingroup\$ This might be better suited for StackOverflow or CodeReview. \$\endgroup\$ Commented Jun 6, 2014 at 13:04
  • \$\begingroup\$ If you want the shortest solution in bytes in order to improve golfing down this particular snippet, I think this is well on-topic here (not as a challenge, but as a question asking for golfing advice). If you want the fastest solution, this should rather go in Code Review (and no one prevents you from posting both separately). But the shortest solution will not necessarily be the fastest solution. So what is it you want? \$\endgroup\$ Commented Jun 6, 2014 at 13:10
  • 1
    \$\begingroup\$ wouldn't !(x|y|z) work? \$\endgroup\$ Commented Jun 6, 2014 at 13:12
  • 3
    \$\begingroup\$ Questions on this site should either the contests or asking for tips participating in those contests. Do yourself a favor and don't use any code you find on this site in "the real world", unless you understand exactly what it does. Also, in general, you have to decide between the shortest and the fastest solution. \$\endgroup\$ Commented Jun 6, 2014 at 13:26
  • 2
    \$\begingroup\$ Seeing my answer was apparently what you were looking for, I took the liberty to edit your question to make it more on-topic (and justify my subsequent reopen vote). Feel free to edit the question again if you don't agree with my changes. As stated before, for help with efficiency, try StackOverflow or Code Review. \$\endgroup\$ Commented Jun 6, 2014 at 13:39

3 Answers 3

22
\$\begingroup\$

(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.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ Very insightful! I appreciate you exploring several possibilities, despite the nature of the question being somewhat vague and potentially misinterpretable. \$\endgroup\$ Commented Jun 6, 2014 at 13:40
3
\$\begingroup\$

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(); 
\$\endgroup\$
1
  • \$\begingroup\$ This idiom is important in other contexts. \$\endgroup\$ Commented Dec 26, 2014 at 1:12
0
\$\begingroup\$

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.

\$\endgroup\$
1
  • \$\begingroup\$ Why would you recommend this instead of a simple loop? Also AllZero('', '', '') \$\endgroup\$ Commented Jun 7, 2014 at 0:15

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.