an expression is a phrase
that an interpreter
can evaluate to produce a value
complex expressions
are built from simpler expressions
using operators
3 + 4
a * b
c = 7
an operator combines the values of its operands
&
evaluates to a new value
primary expressions
are constant or literal values
language keywords & variable references
15.67 //=> number literal
'JavaScript' //=> string literal
/[a-zA-Z0-9]/ //=> regular expression literal
null //=> evaluates to `null` value
false //=> evaluates to boolean `false` value
this //=> evaluates to `current` object
undefined //=> evaluates to global variable `undefined`
title //=> evaluates to the value of `title` variable
object & array initializers
are expressions whose values
are a newly created object or array
array initializer
are a comma-separated list of expressions
placed between square brackets
[14 + 1, 10 + 5, 30 / 2] //=> [15, 15, 15]
object initializer
are a comma-separated list of expressions
placed between curly brackets
where each expression is prefixed by a name
var obj = {
first: 14 + 1,
second: 10 + 5,
third: 30 / 2
};
console.log(obj); //=> Object {first: 15, second: 15, third: 15}
the expressions in an object or array initializer
are evaluated each time the initializer is evaluated
this means that the value of the expressions
may be different each time it is evaluated
a
function definition expression
defines a JavaScript function
&
the value is the newly created function
var multiply = function (a, b) {
return a * b;
};
property access expressions
evaluate to the value of an object property
or an array element
there are two syntaxes defined for property access
dot notation
expression.identifier
var obj = {
a: 15
};
obj.a //=> 15
where the expression specifies the object & the identifier specifies the name of the property to be accessed
&
bracket notation
expression[expression]
var obj = {
ab: 15
};
obj['a' + 'b'] //=> 15
obj['ab'] //=> 15
where the first expression is followed by another expression enclosed in square brackets whose value has to be the name of the desired property
the expression before the . or [ is first evaluated
if the value is null or undefined it throws a TypeError
dot notation syntax is the simpler of the two
BUT
it can only be used when the property that needs to be accessed
is a legal identifier
var obj = {
a: 15,
b: [7.5, 7.5],
c: {
d: {
e: 30 - 15
}
}
};
var arr = [ 1, 'JavaScript', obj, function () { return obj; } ];
obj.a //=> 15
obj.b[1] //=> 7.5
obj.c.d.e //=> 15
obj['c']['d'].e //=> 15
obj['a' + 'b'][0] //=> TypeError: Cannot read property '0' of undefined
arr[0] //=> 1
arr[2].a //=> 15
arr[2]['c']['d']['e'] //=> 15
arr[3]().c.d.e //=> 15
a more complex example
invocation expressions
are JavaScript's syntax for executing functions or methods
someFunction(15); // `someFunction` is the function expression & `15` is the argument expresion
var obj = {
age: null,
setAge: function (age) {
this.age = age;
},
getAge: function () {
return this.age;
}
};
obj.setAge(15); //=> obj.age value is now 15
obj.getAge(); //=> 15 - returns the obj.age value
when an invocation expression is evaluated
the function expression is evaluated first
&
then the argument expressions are evaluated
to produce a list of argument values
if the value of the function expression
is not a callable object it throws a TypeError
Object.push(obj, 'title', 'JavaScript - The Basics');
//=> TypeError: undefined is not a function
next if callable
argument values are assigned to parameter names
&
then the function body is executed
an
object creation expression
creates a new object & invokes a function to initialize the properties of that object
this function is called constructor
object creation expressions
are like invocation expressions
except they are prefixed by the new keyword
function Course(title) {
this.title = title || 'Untitled';
}
var course = new Course('JavaScript - The Basics');
console.log(course); //=> Course {title: "JavaScript - The Basics"}
operators
are used in
arithmetic / comparison / logical /
assignament / relational / evaluation / special
expressions
operators
are punctuation characters like + or =
or
keywords such as delete and typeof
Operator | Operation | Associativity | Number of operands | Types |
++ | pre- or post-increment | right-to-left | 1 | lval ⇒ num |
-- | pre- or post-decrement | right-to-left | 1 | lval ⇒ num |
- | negate number | right-to-left | 1 | num ⇒ num |
+ | convert to number | right-to-left | 1 | num ⇒ num |
~ | invert bits | right-to-left | 1 | int ⇒ int |
! | invert boolean value | right-to-left | 1 | bool ⇒ bool |
delete | remove a property | right-to-left | 1 | lval ⇒ bool |
typeof | determine type of operand | right-to-left | 1 | any ⇒ str |
void | return undefined value | right-to-left | 1 | any ⇒ undef |
*, /, % | multiply, divide, remainder | left-to-right | 2 | num, num ⇒ num |
+, - | add, subtract | left-to-right | 2 | num, num ⇒ num |
+ | concatenate strings | left-to-right | 2 | str, str ⇒ str |
<< | shift left | left-to-right | 2 | int, int ⇒ int |
the below table lists all JavaScript operators
ordered by their precedence
(first having heigher precedence)
horizontal blue lines separate operators with different precedence levels
Operator | Operation | Associativity | Number of operands | Types |
>> | shift right with sign extension | left-to-right | 2 | int, int ⇒ int |
>>> | shift right with zero extension | left-to-right | 2 | int, int ⇒ int |
<, <=, >, >= | compare in numeric order | left-to-right | 2 | num, num ⇒ bool |
<, <=, >, >= | compare in alphabetic order | left-to-right | 2 | str, str ⇒ bool |
instanceof | test object class | left-to-right | 2 | obj, func ⇒ bool |
in | test whether property exists | left-to-right | 2 | str, obj ⇒ bool |
== | test for equality | left-to-right | 2 | any, any ⇒ bool |
!= | test for inequality | left-to-right | 2 | any, any ⇒ bool |
=== | test for strict equality | left-to-right | 2 | any, any ⇒ bool |
!== | test for strict inequality | left-to-right | 2 | any, any ⇒ bool |
& | compute bitwise AND | left-to-right | 2 | int, int ⇒ int |
^ | compute bitwise XOR | left-to-right | 2 | int, int ⇒ int |
| | compute bitwise OR | left-to-right | 2 | int, int ⇒ int |
&& | compute logical AND | left-to-right | 2 | any, any ⇒ any |
|| | compute logical OR | left-to-right | 2 | any, any ⇒ any |
? : | choose scond or third operand | right-to-left | 3 | bool, any, any ⇒ any |
= | assign to a variable or property | right-to-left | 2 | lval, any ⇒ any |
*=, /+, %=, +=, -=, &=, ^=, |=, <<=, >>=, >>>= |
operate and assign | right-to-left | 2 | lval, any ⇒ any |
, | discard first operand, return second | left-to-right | 2 | any, any ⇒ any |
operators
can be categorized by
number of operands
precedence
associativity