Check If Two or More Variables Are All Equal to Zero in JavaScript

4

1

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

purefusion

Posted 2014-06-06T12:58:41.850

Reputation: 167

1This might be better suited for StackOverflow or CodeReview. – Kyle Kanos – 2014-06-06T13:04:04.803

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? – Martin Ender – 2014-06-06T13:10:00.270

1wouldn't !(x|y|z) work? – Danny – 2014-06-06T13:12:32.020

3Questions 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. – Dennis – 2014-06-06T13:26:19.220

2Seeing 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. – Martin Ender – 2014-06-06T13:39:36.137

Code Golf it is... and yes, I know not to use code from this site in production. – purefusion – 2014-06-06T13:39:55.133

If the question doesn't get reopened and more answers posted by tomorrow, I'll re-mark your answer as final. However, if reopened and shorter answers are posted, I'll oblige per the rules of the site. – purefusion – 2014-06-06T13:47:06.457

I don't think code-golf and tips are combinable. In my opinion, this is a tips question, since code golf contests are usually more complex and not restricted to a single language. – Dennis – 2014-06-06T13:55:33.183

@Dennis I'd say in the presence of a tips tag, code-golf loses it's "this is a challenge" meaning but says "this is a question about tips regarding code golf" (as opposed to some other type of code challenge). I feel like this may have been discussed on meta, though. – Martin Ender – 2014-06-06T14:30:28.643

@m.buettner: Looking at other tips questions, you might be right. My previous comment was mostly directed at the OP, who vowed to oblige per the rules of the site. There are no rules for tips questions. – Dennis – 2014-06-06T18:21:39.937

Answers

22

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

Martin Ender

Posted 2014-06-06T12:58:41.850

Reputation: 184 808

1Very insightful! I appreciate you exploring several possibilities, despite the nature of the question being somewhat vague and potentially misinterpretable. – purefusion – 2014-06-06T13:40:56.853

3

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();

Florian F

Posted 2014-06-06T12:58:41.850

Reputation: 591

This idiom is important in other contexts. – Joshua – 2014-12-26T01:12:06.303

0

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.

Grax32

Posted 2014-06-06T12:58:41.850

Reputation: 1 282

Why would you recommend this instead of a simple loop? Also AllZero('', '', '')

– nderscore – 2014-06-07T00:15:03.063