Computers have a very particular idea of when things are true and false.
Try the following in node:
1 < 2
2 + 2 < 4
2 + 2 <= 4
"anonymous".endsWith("us")
"every journey".startsWith("a step")
Comparison operators let you compare two values. JavaScript has all the usual suspects...
Operator | Comparison |
---|---|
< |
less than |
> |
greater than |
<= |
less than or equal to |
>= |
greater than or equal to |
== |
equal to |
!= |
not equal |
=== |
really equal to |
!== |
really not equal to |
These are also called "Boolean operators" after George Boole, a 19th-century mathematician who invented Boolean algebra.)
The magic word if
is a conditional.
The phrase immediately after if
is a condition.
if (age < 18) {
console.log("Sorry, you can't vote yet.");
}
phrase | meaning |
---|---|
if ( ... )
|
if this condition's value is truthy |
{ ... }
|
then run this block of code |
Wait a second. "Truthy?"
in the Colbert Report, truthiness means things we feel to be true, even though we know they're probably not
In JavaScript, all values have truthiness unless they are defined as falsy.
false
, null
, undefined
, 0
, NaN
, and the empty string (""
) are all falsy.
Fortunately, true
is truthy and false
is falsy.
Unfortunately, the string "false"
is truthy, and the string "0"
is truthy, even though the number 0
is falsy.
The magic word else
allows BRANCHING.
if (age >= 18) {
console.log("allowed");
} else {
console.log("denied");
}
Like a fork in the road, the program chooses one path or the other.
It takes the first path if the condition is truthy, and takes the second path if the condition is falsy.
Sadly, this mathematical expression:
2 + 2 = 4
causes an error. You need to do
2 + 2 == 4
instead. Why?
name = "Alice"
-- "assign the value 'Alice' to the variable 'name'"name == "Alice"
-- "does the variable 'name' contain the string 'Alice'?"This is confusing! (More about it on the next slide.)
"A notorious example for a bad idea was the choice of the equal sign to denote assignment. It goes back to Fortran in 1957 and has blindly been copied by armies of language designers. Why is it a bad idea? Because it overthrows a century old tradition to let "=" denote a comparison for equality, a predicate which is either true or false. But Fortran made it to mean assignment, the enforcing of equality...
x = y
does not mean the same thing asy = x
."— Niklaus Wirth, Good Ideas, Through the Looking Glass (2005)
see also http://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Assignment_versus_equality
BEWARE of using a single equal sign inside an
if
condition!
the value of a comparison is either true
or false
if (x == 2)
means if x is 2
which changes based on x
the value of an assignment is the value being assigned
if (x = 2)
means if 2
which is always truthy
x
will be 2 afterwards, no matter what it was beforeIn addition to =
and ==
, JavaScript also has ===
.
That's three equal signs in a row.
Operator | Operation | Example | Meaning |
---|---|---|---|
= |
assignment | X = Y |
let X equal Y |
== |
comparison (fuzzy) | X == Y |
does X mostly equal Y? |
=== |
comparison (exact) | X === Y |
does X really equal Y? |
==
means "does X equal Y, or if not, can Y be converted into something that equals X?"
Since the rules for type conversion are confusing, most JavaScript experts recommend:
always use
===
, never use==
You can make more complicated logical expressions using conjunctions:
Conjunction | Operator | Example | Meaning |
---|---|---|---|
AND | && |
X && Y |
"are both X and Y true?" |
OR | || |
X || Y |
"is either X or Y (or both) true?" |
NOT | ! |
!X |
"is X false?" |
For example:
if (age >= 18 || hasPermissionSlip()) {
console.log("allowed");
} else {
console.log("denied");
}
hello.js
program should currently look something like this:console.log("What is your name?");
process.stdin.on('data', (chunk) => {
let name = chunk.toString();
console.log("Hello, " + name + "!");
});
hello.js
so that it doesn't always say hello!
hello.js
so it keeps asking for names forever...
hello.js
so that it says "Go away!" if the user's name is any one of a number of evil namesVolDeMort
/