JavaScript-introduction and Overview
JavaScript-introduction and Overview
Contents
1 JavaScript Basics
..............................
Overview . . . . . . . . . . . . .
Syntax Basics . . . . . . . . . . .
...............................
Operators . . . . . . . . . . . . . .
..............................
Basic Operators . . . . . . .
......
........................
Operations on Numbers & Strings . . .
........................
Logical Operators . . . . . .
......
........................
Note . . . . . . . . . . . . .
..............................
Comparison Operators . . .
.......
.......................
Conditional Code . . . . . . . . . .
..............................
Note . . . . . . . . . . . . .
..............................
Truthy and Falsy Things . . . . . . . . .
.......................
Conditional Variable Assignment with The Ternary Operator . . . . . . . . . . . .
Switch Statements . . . . . .
......
........................
Loops . . . . . . . . . . . . . . . .
..............................
The for loop . . . . . . . . .
.......
.......................
The while loop . . . . . . .
.......
.......................
The do-while loop . . . . .
.......
.......................
Breaking and continuing . . . . . . . . .
.......................
Reserved Words . . . . . . . . . . .
..............................
Arrays . . . . . . . . . . . . . . . .
..............................
Objects . . . . . . . . . . . . . . . .
..............................
Functions . . . . . . . . . . . . . .
..............................
Using Functions . . . . . . .
.......
.......................
Self-Executing Anonymous Functions . .
.......................
Functions as Arguments . . . . . . . . .
.......................
Testing Type . . . . . . . . . . . . .
..............................
The this keyword . . . . . . . . . .
..............................
Note . . . . . . . . . . . . .
..............................
Scope . . . . . . . . . . . . . . . .
..............................
Closures . . . . . . . . . . . . . .
...............................
3
4
4
4
4
5
5
5
6
6
6
7
7
7
8
8
9
9
10
10
11
11
12
12
13
13
13
14
15
16
17
1 JavaScript
Basics
Home Smooth CoffeeScript
Formats Markdown PDF HTML
1 JavaScript Basics
Overview
JavaScript is a rich and expressive language in its own right. This section covers the basic concepts of
JavaScript, as well as some frequent pitfalls for people who have not used JavaScript before. While it will be of
particular value to people with no programming experience, even people who have used other programming
languages may benefit from learning about some of the peculiarities of JavaScript.
If youre interested in learning more about the JavaScript language, I highly recommend JavaScript: The
Good Parts by Douglas Crockford.
Syntax Basics
Understanding statements, variable naming, whitespace, and other basic JavaScript syntax.
A simple variable declaration
var foo = hello
world ;
hello
world ;
// ret urns
// ret urns
Operators
Basic Operators
Basic operators allow you to manipulate values.
Concatenation
var foo = hello ; var
bar = world ;
con sole . log ( foo + + bar ); // hello
world
= 1;
= ++ i ;
// pre - i n c r e m e n t : j
equals
2; i
equals
var k
= i ++;
// post - i n c r e m e n t : k equals
2; i
equals
1 JavaScript Basics
// 12. uh oh
The Number constructor, when called as a function (like above) will have the effect of casting its
argument into a number. You could also use the unary plus operator, which does the same thing:
Forcing a string to act as a number (using the unary-plus operator)
con sole . log ( foo + + bar );
Logical Operators
Logical operators allow you to evaluate a series of operands using AND and OR operations.
Logical AND and OR operators
var foo = 1; var
bar = 0; var baz
= 2;
foo || bar ; // ret urns 1 , which is true bar || foo ; // ret
urns 1 , which is true
foo && bar ; // ret urns 0 , which is false foo && baz ; //
ret urns 2 , which is true baz && foo ; // ret urns 1 , which
is true
Though it may not be clear from the example, the || operator returns the value of the first truthy operand, or, in
cases where neither operand is truthy, itll return the last of both operands. The && operator returns the value
of the first false operand, or the value of the last operand if both operands are truthy.
Be sure to consult the section called Truthy and Falsy Things for more details on which values evaluate
to true and which evaluate to false.
Note
Youll sometimes see developers use these logical operators for flow control instead of using if statements. For example:
//
do s o m e t h i n g with foo if foo is truthy
foo && d o S o m e t h i n g ( foo );
// set
bar to baz if baz is
truthy ;
/ otherwise , set it to the return
/
value of c r e a t e B a r ()
var bar = baz ||
c r e a t e B a r ();
1 JavaScript Basics
This style is quite elegant and pleasantly terse; that said, it can be really hard to read, especially for
beginners. I bring it up here so youll recognize it in code you read, but I dont recommend using it until
youre extremely comfortable with what it means and how you can expect it to behave.
Comparison Operators
Comparison operators allow you to test whether values are equivalent or whether values are identical.
Comparison operators
var foo = 1; var
bar = 0; var baz =
1 ; var bim = 2;
=== baz ;
!== baz ;
=== pa r s e I n t ( baz );
/
/
/
// re turns
// re turns
// re turns
false
true
true
Conditional Code
Sometimes you only want to run a block of code under certain conditions. Flow control via if and else
blocks lets you run code only under certain conditions.
Flow control
var foo = true ; var
bar = false ;
if ( bar ) {
// this code will never run con sole .
log ( hello ! );
}
if ( bar ) {
// this
code won t run
} else {
if ( foo ) {
// this
code will
run
} else {
// this
code would run if foo
}
}
and bar
were both
false
Note
While curly braces arent strictly required around single-line if statements, using them consistently, even
when they arent strictly required, makes for vastly more readable code.
Be mindful not to define functions with the same name multiple times within separate if/else blocks, as
doing so may not have the expected result.
1 JavaScript Basics
string ;
// an empty array
// an empty object
// any non - zero number
While the ternary operator can be used without assigning the return value to a variable, this is generally
discouraged.
Switch Statements
Rather than using a series of if/else if/else blocks, sometimes it can be useful to use a switch statement
instead. [Definition: Switch statements look at the value of a variable or expression, and run different
blocks of code depending on the value.]
A switch statement
switch ( foo ) {
case bar :
alert ( the value was bar -- yay ! ); break ;
case baz :
alert ( boo baz :( ); break
;
def ault :
alert ( e v e r y t h i n g else is just ok ); break ;
1 JavaScript Basics
Switch statements have somewhat fallen out of favor in JavaScript, because often the same behavior can
be accomplished by creating an object that has more potential for reuse, testing, etc. For example:
var s t u f f T o D o = {
bar : f u n c t i o n () {
alert ( the
value
},
baz : f u n c t i o n () { alert (
boo baz :( );
},
default : f u n c t i o n () {
alert ( e v e r y t h i n g else
}
is
just ok );
};
if ( s t u f f T o D o [ foo ]) {
s t u f f T o D o [ foo ]();
} else {
s t u f f T o D o [ default ]();
}
Loops
Loops let you run a block of code a certain number of times.
Loops
// logs try 0 , try 1 , ... , try 4
for ( var i =0; i <5; i ++) {
con sole . log ( try + i );
}
Note that in Loops even though we use the keyword var before the variable name i, this does not scope the variable
i to the loop block. Well discuss scope in depth later in this chapter.
The initialisation statement is executed only once, before the loop starts. It gives you an opportunity to
prepare or declare any variables.
The conditional statement is executed before each iteration, and its return value decides whether or not
the loop is to continue. If the conditional statement evaluates to a falsey value then the loop stops.
The iteration statement is executed at the end of each iteration and gives you an opportunity to change the
state of important variables. Typically, this will involve incrementing or decrementing a counter and thus
bringing the loop ever closer to its end.
The loopBody statement is what runs on every iteration. It can contain anything you want. Youll typically
have multiple statements that need to be executed and so will wrap them in a block ( {...}).
Heres a typical for loop:
A typical for loop
1 JavaScript Basics
for ( var i = 0 , limit
= 100; i
// This block will be e x e c u t e d
con sole . log ( C u r r e n t l y at
// Note : the last
log
will
}
([ c o n d i t i o n a l ]) [ lo o p B o d y ]
increment i
Youll notice that were having to increment the counter within the loops body. It is possible to combine
the conditional and incrementer, like so:
A while loop with a combined conditional and incrementer
var i =
-1;
while (++ i < 100) {
// This block will be e x e c u t e d 100 times con sole .
log ( C u r r e n t l y at + i );
}
Notice that were starting at -1 and using the prefix incrementer (++i).
// this
loop s body will still ex e cute once .
alert ( Hi there ! );
} while
( false );
These types of loops are quite rare since only few situations require a loop that blindly executes at least
once. Regardless, its good to be aware of it.
1 JavaScript Basics
You may also want to continue the loop without executing more of the loops body. This is done using
the continue statement.
Skipping to the next iteration of a loop
for ( var i = 0; i < 10; i ++) {
if ( s o m e t h i n g ) {
co n t i n u e ;
}
//
//
if the c o n d i t i o n a l something has not been met
con sole . log ( I have
been reached );
}
Reserved Words
JavaScript has a number of reserved words, or words that have special meaning in the language. You should
avoid using these words in your code except when using them with their intended meaning.
abstract
case
boolean
catch
break
char
byte
class
const
continue
debugger
default
delete
do
double
else
enum
export
extends
final
finally
float
for
function
goto
if
implements
import
in
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
try
typeof
var
void
volatile
while
with
10
1 JavaScript Basics
Arrays
Arrays are zero-indexed lists of values. They are a handy way to store a set of related items of the same
type (such as strings), though in reality, an array can include multiple types of items, including other
arrays.
A simple array
var myA rray = [ hello , world ];
world ,
// logs
foo , bar ];
bar
];
//
logs 2
= [ hello , world ];
= changed ;
While its possible to change the value of an array item as shown in Changing the value of an array item, its
generally not advised.
Adding elements to an array
var myA rray = [ hello , world ];
myA rray . push ( new );
o ];
// hello
// [ h , e , l , l , o ]
Objects
Objects contain one or more key-value pairs. The key portion can be any string. The value portion can be
any type of value: a number, a string, an array, a function, or even another object.
[Definition: When one of these values is a function, its called a method of the object.] Otherwise, they are
called properties.
As it turns out, nearly everything in JavaScript is an object arrays, functions, numbers, even strings
and they all have properties and methods.
Creating an object literal
var my O b j e c t = {
sa y H e l l o : fu n c t i o n () {
con sole . log ( hello );
},
myName : Rebecca
};
my O b j e c t . s a y H e l l o ();
//
con sole . log ( m y O b j e c t . myName ); //
logs
logs
hello
Rebecca
11
1 JavaScript Basics
Note When creating object literals, you should note that the key portion of each key-value pair can be
written as any valid JavaScript identifier, a string (wrapped in quotes) or a number:
var my O b j e c t = {
validIdentifier:
123 , some string : 456 ,
99999: 789
};
Object literals can be extremely useful for code organization; for more information, read Using Objects to
Organize Your Code by Rebecca Murphey.
Functions
Functions contain blocks of code that need to be executed repeatedly. Functions can take zero or more
arguments, and can optionally return a value.
Functions can be created in a variety of ways:
Function Declaration
fu n c t i o n foo () { /* do
s o m e t h i n g */ }
s o m e t h i n g */ }
I prefer the named function expression method of setting a functions name, for some rather in-depth and technical
reasons. You are likely to see both methods used in others JavaScript code.
Using Functions
A simple function
var greet = f u n c t i o n ( person , g r e e t i n g )
{ var text = gr e e t i n g + , + person ; con sole
. log ( text );
};
greet ( Rebecca , Hello );
12
1 JavaScript Basics
//
undefined!
Functions as Arguments
In JavaScript, functions are first-class citizens they can be assigned to variables or passed to other
functions as arguments. Passing functions as arguments is an extremely common idiom in jQuery.
hello
world ; });
//
logs
hello
world
//
logs
hello
world
Testing Type
JavaScript offers a way to test the type of a variable. However, the result can be confusing for
example, the type of an Array is object.
Its common practice to use the typeof operator when trying to determining the type of a specific value.
13
1 JavaScript Basics
var my S t r i n g = hello ;
var my N u m b e r = 3;
typeof m y F u n c t i o n ;
// re turns
function
typeof
typeof
typeof
typeof
typeof
//
//
//
//
//
object
object
string ;
number
object
myObject;
my Array ;
myString;
myNumber;
null ;
re turns
re turns
re turns
re turns
re turns
-- car eful !
-- car eful !
jQuery offers utility methods to help you determine the type of an arbitrary value. These will be covered
later.
The
this
keyword
In JavaScript, as in most object-oriented programming languages, this is a special keyword that is used
within methods to refer to the object on which a method is being invoked. The value of this is
determined using a simple series of steps:
1. If the function is invoked using Function.call or Function.apply, this will be set to the first argument passed to call/apply. If the first argument passed to call/apply is null or undefined, this will
refer to the global object (which is the window object in Web browsers).
2. If the function being invoked was created using Function.bind, this will be the first argument that
was passed to bind at the time the function was created.
3. If the function is being invoked as a method of an object, this will refer to that object.
4. Otherwise, the function is being invoked as a standalone function not attached to any object, and
this will refer to the global object.
A function invoked using Function.call
var my O b j e c t = {
sa y H e l l o : fu n c t i o n () {
con sole . log ( Hi ! My name is
},
myName : Rebecca
this . myName );
};
var s e c o n d O b j e c t = {
myName : Colin
};
my O b j e c t . s a y H e l l o ();
//
logs Hi ! My name is
Rebecca
my O b j e c t . s a y H e l l o . call ( s e c o n d O b j e c t ); //
logs Hi ! My name is
Colin
14
1 JavaScript Basics
A function created using Function.bind
var myName = the global
object ,
sa y H e l l o = fu n c t i o n () {
con sole . log ( Hi !
},
my O b j e c t = {
My
name is
this . myName );
myName : Rebecca
};
var m y O b j e c t H e l l o = s a y H e l l o . bind ( my O b j e c t );
sa y H e l l o ();
// logs
Hi ! My name is
the
global
m y O b j e c t H e l l o (); // logs
Hi ! My name is
Rebecca
object
My
name is
this . myName );
myName : Rebecca
},
secondObject = {
myName : Colin
};
my O b j e c t . s a y H e l l o = s a y H e l l o ;
s e c o n d O b j e c t . sa y H e l l o = s a y H e l l o ;
sa y H e l l o ();
//
logs Hi !
My name is
my O b j e c t . s a y H e l l o ();
//
s e c o n d O b j e c t . sa y H e l l o (); //
My name is
My name is
logs Hi !
logs Hi !
Note
When invoking a function deep within a long namespace, it is often tempting to reduce the amount of
code you need to type by storing a reference to the actual function as a single, shorter variable. It is
important not to do this with instance methods as this will cause the value of this within the function to
change, leading to incorrect code operation. For instance:
var
myNamespace
= { my O b j e c t : {
sa y H e l l o : fu n c t i o n () {
co n sole . log ( Hi ! My name is + this . myName );
},
myName : Rebecca
}
};
var hello = m y N a m e s p a c e . m y O b j e c t . s a y H e l l o ;
hello ();
//
logs
Hi ! My name is
undefined
You can, however, safely reduce everything up to the object on which the method is invoked:
15
1 JavaScript Basics
var
myNamespace
= { my O b j e c t : {
sa y H e l l o : fu n c t i o n () {
co n sole . log ( Hi ! My name is + this . myName );
},
myName : Rebecca
}
};
var
obj = m y N a m e s p a c e . m y O b j e c t ;
obj . sa y H e l l o ();
//
logs
Hi ! My name is Rebecca
Scope
Scope refers to the variables that are available to a piece of code at a given time. A lack of
understanding of scope can lead to frustrating debugging experiences.
When a variable is declared inside of a function using the var keyword, it is only available to code inside
of that function code outside of that function cannot access the variable. On the other hand, functions
defined inside that function will have access to to the declared variable.
Furthermore, variables that are declared inside a function without the var keyword are not local to the
function JavaScript will traverse the scope chain all the way up to the window scope to find where the
variable was previously defined. If the variable wasnt previously defined, it will be defined in the global
scope, which can have extremely unexpected consequences;
Functions have access to variables defined in the same scope
var foo = hello ;
var sa y H e l l o = fu n c t i o n ()
{ con sole . log ( foo );
};
sa y H e l l o ();
con sole . log ( foo );
// logs
// also
hello
logs hello
Code outside the scope in which a variable was defined does not have access to the variable
var sa y H e l l o = fu n c t i o n ()
{ var foo = hello ;
con sole . log ( foo );
};
sa y H e l l o ();
con sole . log ( foo );
// logs hello
// doesn t log a n y t h i n g
Variables with the same name can exist in different scopes with different values
var foo = world ;
var sa y H e l l o = fu n c t i o n ()
{ var foo = hello ;
con sole . log ( foo );
};
sa y H e l l o ();
con sole . log ( foo );
// logs
// logs
hello
world
Functions can see changes in variable values after the function is defined
16
1 JavaScript Basics
var m y F u n c t i o n = fu n c t i o n () {
var foo = hello ;
var myFn = fu n c t i o n () {
con sole . log ( foo );
};
foo = world ;
return
};
var f =
f ();
myFn ;
m y F u n c t i o n ();
//
logs world -- uh oh
Scope insanity
// a self - e x e c u t i n g a n o n y m o u s
fu n c t i o n
( f u n c t i o n () {
var baz = 1;
var bim = f u n c t i o n () { alert ( baz ); };
bar = f u n c t i o n () { alert ( baz ); };
})();
con sole . log ( baz );
// baz is not de f ined ou tside of the f u n c t i o n
bar ();
//
bim ();
bar
is de f ined ou tside of
so this
will result in an
the a n o n y m o u s fu n c t i o n
error
Closures
Closures are an extension of the concept of scope functions have access to variables that were
available in the scope where the function was created. If thats confusing, dont worry: closures are
generally best understood by example.
In Functions cansee changes in variable values after the function is defined, we saw how functions
have access to changing variable values. The same sort of behavior exists with functions defined within
loops the function sees the change in the variables value even after the function is defined,
resulting in all clicks alerting 5.
How to lock in the value of i?
/* this
won t behave as we want it to ; */
/* every click will alert 5 */
for ( var i =0; i <5; i ++)
{
$ ( <p > click me </ p > ). ap p e n d T o ( body ). click ( f u n c t i o n () {
alert ( i );
});
}
17
1 JavaScript Basics
};
for ( var i =0; i <5; i ++) {
$ ( <p > click me </ p > ). ap p e n d T o ( body ). click ( c r e a t e F u n c t i o n ( i ));
}
Closures can also be used to resolve issues with the this keyword, which is unique to each scope:
Using a closure to access inner and outer object instances simultaneously
var ou t e r O b j =
{ myName : outer ,
outerFunction : function
() {
//
pr ovide a r e f e r e n c e to ou t e r O b j
//
th rough innerFunction s cl o sure
var self = this ;
var i n n e r O b j = {
myName : inner ,
i n n e r F u n c t i o n : f u n c t i o n () {
// logs outer inner
co n sole . log ( self . myName , this . myName );
}
};
in n e r O b j . i n n e r F u n c t i o n ();
con sole . log ( this . myName ); //
logs
outer
}
};
ou t e r O b j . o u t e r F u n c t i o n ();
This mechanism can be particularly useful when dealing with callbacks, though in those cases, it is often
better to use Function.bind, which will avoid any overhead associated with scope traversal.
18