 So, here's the confusing part about infix notation, whereas in prefix notation, a set of parentheses always denotes the invocation of an operator or the call to a function. In infix notation, they do not. In infix notation, we often have operations which are not surrounded in a pair of parentheses and then also have expressions which are superfluously surrounded in parentheses. Here for example, we have an expression of the variable foo, which simply evaluates into the current value foo, whatever that may be. In infix notation, we can surround foo in as many pairs of superfluous parentheses as we like, and the expression remains unchanged, it's still just the variable foo. In prefix notation, though, we can't do this, we have to just leave it as foo with no parentheses because in prefix notation, surrounding foo in parentheses calls foo as a function. If we want to call foo as a function in infix notation, we put the parentheses after the variable, any extra parentheses surrounding the whole expression still don't do anything. Assignment in JavaScript is considered an operation, not a distinct kind of statement. The assignment operator is an equal sign and you put the target of the assignment on the left and the value to assign on the right. For example here, the division operator has a higher precedence than the assignment operator, so the division here is done first, so bar divided by two, that value is assigned to the variable foo. If we were to write the equivalent statement in pigeon, it would look like this. The odd thing about assignment as an expression is that the target of the assignment, the thing which is the left operand, is not like an operand to any other operation because it's not really an expression. The target doesn't evaluate into a value which is then used by the operation, instead the target specifies a variable to modify. In the JavaScript specification, targets of assignment are called L values, in contrast to normal expressions which are called R values. The L and R stand for left and right, as in the left and right side of the assignment operator. R values are things which can go on the left side of the assignment operator, R values are things which can go on the right. A simple variable name is the most common kind of L value, but as we'll see later there are a couple more kinds in JavaScript. Another oddity about assignment as an operation is that it raises the question of, well, what does an assignment operation return? The answer is that an assignment operation simply returns the value it assigns, so this assignment operation here returns whatever value it assigns to foo. Since the assignment operator returns a value, we can chain assignments like this. Here the addition operation comes first because addition has a higher precedence than assignment. Then we do the assignments from right to left because the assignment operator is right to left associative, meaning that if we have a chain of them, we start on the right side and work leftwards. So 4 plus 2 that produces 6 which gets assigned to z, and then this rightmost assignment itself returns 6 to assign to y, and that assignment in turn returns 6 to assign to x. If we wrote parentheses around these operations to make their order explicit, it would look like this. In effect, every variable in the chain gets assigned the same value. Note that were the assignment operator left to right associative instead of right to left associative, chaining assignments wouldn't work. As you can see, that would mean assigning the value of z to the expression x equals y, but that doesn't make any sense. x equals y is not a valid kind of assignment target. It's not an L value. So in fact, the assignment operator is made right to left associative to make chaining assignments possible. Expression statements in JavaScript all end in semicolons. Here we have four expression statements. The first assigns the value of 3 to x, the second assigns 2 plus x to cow, the third calls the function foo with the argument 1, and the fourth calls bar with no argument and assigns its returned value to rat. The reason for these semicolons is that JavaScript syntax is free of form, meaning that wherever the language allows or requires a whitespace character, you can put one or more whitespace characters of any kind. For example, here we have the statement 5 assigned to x written with whitespace in three different ways. In the first example, we just stuck to a sensible style, how the statement would most commonly be written, but as you can see, we can use different spacing and write the expression across multiple lines. Even if we normally wouldn't want to write it that way, it is legal JavaScript code. Having a free form syntax does occasionally help us out, such as when calling a function with a verbose series of arguments, because then we can spread that call onto multiple lines. Most of the time, however, we're just going to write our code with the same indentation style we saw in Pigeon. Comments in JavaScript can be written in two ways. An end-of-line comment, a comment like in Pigeon, is written with a pair of forward slashes instead of the number sign. A multi-line comment, a comment that can extend across multiple lines, begins with a slash asterisk and ends with an asterisk slash. Note that with a multi-line comment, text after the ending asterisk slash is considered part of the code, even if it's on the same line as the comment. Here, the call to bar is code, not part of the comment. The deceptive thing about multi-line comments is that you cannot nest a multi-line comment inside another multi-line comment. Here, the language considers the comment to run from the first slash asterisk to the first asterisk slash, leaving lemon asterisk slash as part of the code. Identifiers in JavaScript conform to the same rules they do in Pigeon, except in JavaScript, you can also use underscores and the dollar sign. So, these are all valid identifiers in JavaScript. In Pigeon, we implicitly created variables by assigning to a previously unused name, but in JavaScript, we have to explicitly declare the existence of our variables using a var statement. The var statement begins with the reserved word var, followed by the name of the variable, and then optionally an assignment to give that variable an initial value. Here, we're declaring a variable named monkey and another name zebra, which is given the initial value three. When we declare a variable but don't give it a value, its value is not null as you might expect, but rather a different value called undefined. So here, for instance, if we declare a variable named Jeff without any initial value and then pass Jeff as argument to a function, the parameter for that argument receives the value undefined. In contrast, a variable which hasn't been declared doesn't exist, and so if we attempt to use an undeclared variable like Amanda here, that triggers an error.