JavaScript Tip - Invert Logical Expressions With De Morgan's Laws
Just something I want to keep around for reference. Ignore if you don't program. - matte
Reprinted from SitePoint Community Crier #71. Without permission but credit is given. :)
A JavaScript expression will sometimes be more intuitive (and easier to understand) when written a certain way, but, often, we may actually need the inverse of that expression. For example, in Listing 1 below, our code only needs to react if (x && y) is false. We need to invert the expression.
Listing 1
if (x && y)
{
// we don't have anything to do here
}
else
{
// we want to do something here
}
De Morgan's laws describe how to invert a logical expression. In Listing 2, we see De Morgan's Laws in action within the JavaScript syntax.
Listing 2
!(x || y) == (!x && !y)
!(x && y) == (!x || !y)
The rule inverts each logical term and each logical operator.
In Listing 3, we invert the expression from Listing 1 by applying De Morgan's Laws.
Listing 3
if (!x || !y)
{
// we want to do something here
}
Sometimes, a logical term is more complex than a simple boolean variable. A logical term may be a relational expression, such as (p < q) from Listing 4. We must invert the relational expression as a whole.
Listing 4
if (p < q && r != s)
{
// we don't have anything to do here
}
else
{
// we want to do something here
}
Let's invert the expression step by step.
Note that this expression is of the same form as our original expression in Listing 1 (x && y) where x is replaced with (p < q) and y is replaced with (r != s). De Morgan's rule is to invert each logical term and invert each logical operator.
Inverting the first logical term (p <>= q)
Inverting the next logical term (r != s) we get (r == s)
Inverting the logical operator && we get ||
The result is shown in Listing 5.
Listing 5
if (p >= q || r == s)
{
// we want to do something here
}
So, if you find yourself struggling with a JavaScript problem, pick up an old math textbook -- your solution is probably in there.
Visit us at the SitePoint JavaScript Forum if you have any questions.
Keep it fun :-)
Mike Foster - Programming Team Mentor
<< Home