JavaScript Basics

JavaScript Runtime Environments

  • In a terminal emulator
    • using a nodejs REPL
    • using nodejs and a source file
  • In a browser
    • using javascript console
    • using html to load a source file
    • using a "web repl"

nodejs REPL

$ node
> 1 + 1;
2
> var greeting = "Hello World";
undefined
> greeting;
'Hello World'

nodejs source file

$ echo 'process.stdout.write("Hello World");' >> helloworld.js
$ node helloworld.js
Hello World

Chrome JavaScript console

a REPL in the current page

OSX : cmd + option + j

Win / Linux : ctrl + shift + j

Source Linked in HTML

using the <script> tag

<script src="helloworld.js"></script>

Web REPL

More Web REPLs

http://repl.it/languages/JavaScript

http://jsbin.com

http://jsfiddle.net

JavaScript Statements

A statement performs an action
An expression may also be used wherever JavaScript expects a statement  (called an "expression statement")

Statements end with a semicolon

var foo;       // variable statement

{              // block statement
  foo = "bar"; // assignment statement
}

for (var i = 0; i < 10; i++) { // for statement
   // execute more statements
}

return true;   // return statement

JavaScript Expressions

produce a value and can be written wherever a value is expected.

// expressions produce a value
true         // true
2 + 3        // 5
5 < 10       // true
add( 2, 3 ); // 5
function( base, increment ){}  // [Function]

// can be used as an argument in a function call
add( 2, 4*2 );  // 10

// or in an if statement
if( add( 2, 4*2 ) === 10 ){
  // true
}

JavaScript Keywords

are reserved words

More reserved words

built-in objects, properties, and methods

  • Array      
  • Infinity   
  • Math       
  • prototype  
  • Date      
  • isFinite  
  • NaN       
  • String  
  • function     
  • isPrototypeOf
  • eval      
  • isNaN     
  • name      
  • toString   
  • hasOwnProperty
  • length
  • Object
  • valueOf 
  • Number       
  • undefined  

Your code editor will highlight (most) keywords

highlighted as blue

Never use reserved words as variable or function names

var var = function;

function var() { 
	var true = false;
	var = true;
	var return = var;
	if( var === true ){
		return return;
	}
}

JavaScript Operators

+      Addition

        or concatenate

-       Subtraction

*      Multiplication

/       Division

%     Modulus

++    Increment

--      Decrement
 

Arithmetic

JavaScript Operators

=     Assignment 

+=   Increment and Assign

       or concatenate

-=    Decrement and Assign

*=   Multiply and Assign

/=    Divide and Assign

%=  Modulo and Assign

Assignment

JavaScript Operators

==       equality

===     strict equality

!=        inequality

!==      strict inequality

&&      logical AND

||        logical OR

Comparison and Logic

>         greater than

<         less than

>=       greater than or equal to

<=       less than or equal to

Remember

= is for assignment

== and === are for comparing equality

Variables

"containers" for data

To define a new variable

use the keyword var

// define
var my_awesome_variable_name;

// access to change value
my_awesome_variable_name = "A literal value of type String";

// access to read value
console.log( my_awesome_variable_name );

// define and set value in one line
var some_numbers = [0,1,2,3,4,5];

Variable Name Rules

  • contain only alphanumeric characters,
    underscores, and dollar signs
    (no other special characters)
  • must begin with a letter, $, or _
  • are case sensitive
  • must not be a reserved word
  • cannot have any spaces

Multiple Word Variable Names

use camelCase to seperate words

var userName;
var firstName;
var lastName;

Primitive Data Types

  • String
  • Number
  • Boolean
  • Object
  • Array
  • null
  • undefined

String Data Type

Syntax for Strings

// Strings are wrapped between double quotes
"Hello World"

// or single quotes
'Hello Solar System'

// wrap literal single quotes in double quotes
"Hello Local Interstellar Cloud, i'm fine"

// wrap literal double quotes in single quotes
'Hello "Local Bubble", how are you?'

// or escape double quotes with a backslash \
"Hello Orion's \"Arm\""

// or escape single quotes with a backslash \
'Hello Virgo\'s Supercluster'

// concatenate strings
"Observble" + "universe"

// concatenate with a space
"Observble" + " " + "universe"

Number Data Type

Syntax for Number

// Integer
42

// Floating Point Value
0.5432
41.9999998
8.2e+2 // 820
8.2e-4 // 0.00082

// Octal (not in strict mode)
010    // 8
012    // 10
0755   // 493

// Hexadecimal
0xf         // 15
0x10        // 16
0xDEADBEEF  // 3735928559

// Not a Number
NaN

// Infinites
Infinity
-Infinity

Boolean Data Type

Syntax for Boolean

// literals
true
false

// falsy
false
0
""
null
undefined
NaN

// truthy, any other value not in the falsy list
true
1
"true"
"false"
function(){}
[]
{}

Booleans

More Truthy Falsy expressions

// falsy, expressions that evaluate to false
!true
0 === 1
undefined || 5 < "potato"

// truthy, expressions that evaluate to true
true
!false
0 !== 1
1 && 1 < 3

Null Data Type

has only one value, null

and it's type is Object

// literal
null

// set a previous value to no value
var empty = "mind";
empty = null;
empty === null  // evaluates to true

undefined Data Type

when a variable doesn't exist, or hasn't been set

// literal
undefined

// create a variable with no value
var zed;
zed == undefined            // true
typeof(zed) === "undefined" // true

Objects

collection of key value pairs

well, almost everything

Literal Objects

aka, Anonymous object

aka, Hash Table

aka, Associative Array

aka, Dictionary

// wrapped in open and closing curly braces
var basic_syntax = {};

// keys seperates value pairs separated by colons
var user = { name : "Jon" };

// keys can have special characters
var student = { "first & last name" : "Finn Human" };

// key value pairs are separated by commas
var color = {
  red : 0,
  green : 0x33,
  blue : 0xFF,
  getRGB : function(){
    return (this.red << 16) + (this.green << 8) + this.blue
  }
};

Accessing Object Properties

// access the "green" property of the "color" object
// using dot notation
color.green    // 51

// as an associative array using array accessor square brackets 
color["green"] // 51

var propertyName = "green";
color[propertyName]  // 51

// invoking the "getRGB" method of the "color" object
color.getRGB();      // 13311
color["getRGB"]();   // 13311

// changing the "blue" property of the "color" object
color.blue = 0xFC;

Functions

define a block statement to execute

Invoking

grabs the flow of control to execute the defined block statement

function doesNothing(){ }
doesNothing();

Functions

// function declaration
function greeting(){
  console.log("Hello World");
}

// function expression
function(){
  console.log("Hello World");
}

// assigning function expression to a variable
var greeting = function(){
  console.log("Hello World");
}

// named function expressions
var greeting = function greeting(){
  console.log("Hello World");
}

// immediately invoked function expression
(function(){
  console.log("Hello World");
})();

Arguments and Parameters

parameters are defined in order

only live within the scope of the function

must be a valid variable name

// declaring a function with two parameters
function add( a, b ){
  return a + b;
}

// invoking the add function with two arguments
add( 1, 2 );  // 3

// assigning the return value of the function to a value
var sum = add( 1, 2 );

return values

// not all functions return a value
function greeting(){
  console.log("Hello World");
}

// functions can only return one time
// then "exits" the function
function createGreeting( name ){
  return "Hello " + name;
  return "Goodbye"; // function already returned, exited
  console.log("I will never execute"); // this is true
}

// the comma operator separates expressions
// evaluates each one, then returns the last
function createNonsense( name, age ){
  return name, age; // only age is returned
}
createNonsense( "Jon", 31 ); // 31

// conditional return
function createGreeting( name, age ){
  if( age < 32 ){
    return "Hello " + name;
  }else{
    return "Hello Mr. " + name;
  }
}

Hoisting

declarations are "hoisted" to the top of the current scope

// a variable declaration
var one;

// a variable assignment
one = "ūnus":

// variable declaration and assignment
var one = "ūnus";

// when this is written
one = "ūnus"; // variable assignment
var one;     // variable declaration

// JavaScript interprets it in this order
var one;     // hoisted to the top
one = "ūnus";

// only the declaration is hoisted
// not the assignment
console.log( two );  // undefined
var two = "duo";

// JavaScript hoists the declaration
var two;
console.log( two );  // undefined
two = "duo";         // assigned

applies to source files

Hoisting

function declaration vs. function expressions

// function declared after it's invoked
three();
function three(){
  return "trēs";
}

// JavaScript interprets in this order
// declaration gets hoisted to the top of the scope
function three(){
  return "trēs";
}
three(); // "trēs"

// assign anonymous function expression to variable four
four();  // "quattuor"
var four = function(){
  return "quattuor";
}

// JavaScript interprets in this order
// variable declaration gets hoisted to the top of the scope
// assignment does not get hoisted
var four;
four();  // Error! four is not a function
four = function(){
  return "quattuor";
}

Hoisting

can cause confusion, understand how JavaScript interprets

// declaration and expression
var five = function(){
  return 5;
}
function five(){
  return "quīnque";
}
five();  // ??

What is the result of invoking five() ?

Hoisting

can cause confusion, understand how JavaScript interprets

// declaration and expression
var five = function(){
  return 5;
}
function five(){
  return "quīnque";
}
five();  // ??

// JavaScript hoists only declarations
function five(){ // functions are hoisted first
  return "quīnque";
}
var five; // hoisted to top of scope
five = function(){ // assignment in original position
  return 5;
}
five();  // 5

Control Flow

the order that JavaScript interprets your code

// normal control flow
var foo = 1;
var bar = 2;
console.log( foo );  // 1
console.log( bar );  // 2
console.log( 3 );    // 3
console.log( 4 );    // 4

Control Flow

the flow of control can be manipulated

// drop in to function execution
function thief(){
  console.log( bar );  // 2
  console.log( 3 );    // 3
}

var foo = 1;
var bar = 2;
console.log( foo );  // 1
thief();  // takes control
// resume control
console.log( 4 );    // 4

Control Flow

the flow of control can be conditional

// block statement
{
  console.log( "group of statements" );
  console.log( "that run in containing scope" );
  var foo = 1;
}

var bar = 2;
console.log( foo );  // 1
if( foo > 100 ){ // block statement does not run
  console.log( bar );
  console.log( 3 );
}
console.log( 4 );  // 4

Control Flow

the flow of control can be repeated

// for loop
for( var i=0; i<3; i++ ){
  console.log( "statement "+i+" repeats 3 times" );
}

// while loop
var i = 0;
while( i < 3 ){
  console.log( "statement "+i+" repeats 3 times" );
  i++;
}

// do while loop
var k = 3;
do{
  console.log( "statement "+k+" runs once" );
  k++;
}while( k < 3 );

Exception Handling

normal flow is disrupted by an error

// try will run execute the block statement
// and exit as soon as an exception is thrown
var humans = { pewDiePie : "PewDiePie" };
try{
  console.log("Attack pewDiePie");
  delete humans.pewDiePie;
  console.log("woot!");
}catch(error){
  console.log("You cannot kill "+humans.pewDiePie);
}

// catch will execute the block statement
// if try throws an exception
var chuckNorris = "Chuck Norris";
try{
  console.log("Attack chuckNorris");
  chuckNorris.kill();
  console.log("woot!");
}catch(error){  // handle the exception
  console.log("You cannot kill "+chuckNorris);
}

Throwing Errors

var humans = { pewDiePie : "PewDiePie" };

// throw your own exceptions
function kill( humanName ){
  if( humanName === "Chuck Norris" ){
    throw (new Error("You cannot kill "+humanName));
    // exits function block statement
  }
  delete humans[humanName];
  console.log("killed "+humanName);
}

try{
  kill("pewDiePie");
  kill("Chuck Norris");
  console.log("woot!");
}catch(error){
  console.log(error.message);
  // do something more useful, like run away!
}

Strict Mode

// applies strict mode to the current and child scopes
function(){
  "use strict"; // invokes strict mode
  console.log( "in strict mode" );
  function(){
    console.log( "also in strict mode" );
  }
}
// out of scope
console.log( "NOT in strict mode" );

Invoking Strict Mode

Strict Mode

  • Silent errors now throw errors
  • Allows the interpreter to perform optimizations
  • Prohibits some syntax that may be defined in future versions of ECMAScript
  • Makes it easier to write "secure" code

Non-Strict Mode

// accidentally defining a variable in the global scope
foo = "bad";  // forgot to use the var keyword
// no errors are thrown
global.foo; // bad

Strict Mode

"use strict";
// accidentally defining a variable in the global scope
foo = "bad";  // forgot to use the var keyword
// throws ReferenceError: foo is not defined
"use strict";
var foo = "good";

Non-Strict Mode

var foo = 1;
fuu = 2;     // typo
foo;         // 1, oops!
global.fuu;  // 2, pollution!

Strict Mode

"use strict";
var foo = 1;
fuu = 2;  // typo
// throws ReferenceError: fuu is not defined

Non-Strict Mode

// normal mode allows duplicate keys in objects
var favorites = {
  starWars : "episode 6",
  starWars : "episode 1"
}
favorites.starWars;  // ??

Strict Mode

"use strict";
var favorites = {
  starWars : "episode 6",
  starWars : "episode 1"
  // SyntaxError: Duplicate data property in object
  //              literal not allowed in strict mode
}
// exited due to error

Strict Mode

ECMAScript6 keywords are now reserved words

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

Strict Mode

 prohibits function statements not at the top level of a script or function

"use strict";
if (true){
  function foo() { }
  // SyntaxError: In strict mode code, functions can only be declared 
  //              at top level or immediately within another function.
  foo(); // program exited
}

for (var i = 0; i < 5; i++){
  function bar() { }
  // SyntaxError: In strict mode code, functions can only be declared 
  //              at top level or immediately within another function.
  bar(); // program exited
}

function baz(){       // ok
  function qux() { }  // ok
  function norf() { } // ok
}

js-basics

By Jon Borgonia

js-basics

Data Types, Control, Loops

  • 2,912