3 - Javascript Notes
3 - Javascript Notes
3 - Javascript Notes
JavaScript is the most popular and widely used client-side scripting language. Client-side
scripting refers to scripts that run within your web browser. JavaScript is designed to add
interactivity and dynamic effects to the web pages by manipulating the content returned from
a web server. JavaScript was originally developed as LiveScript by Netscape in the mid 1990s.
It was later renamed to JavaScript in 1995, and became an ECMA standard in 1997. Now
JavaScript is the standard client-side scripting language for web-based applications, and it is
supported by virtually all web browsers available today, such as Google Chrome, Mozilla
Firefox, Apple Safari, etc. JavaScript is an object-oriented language, and it also has some
similarities in syntax to Java programming language. But, JavaScript is not related to Java in
any way. JavaScript is officially maintained by ECMA (European Computer Manufacturers
Association) as ECMAScript. ECMAScript 6 (or ES6) is the latest major version of the
ECMAScript standard.
You can modify the content of a web page by adding or removing elements.
You can change the style and position of the elements on a web page.
You can monitor events like mouse click, hover, etc. and react to it.
You can perform and control transitions and animations.
You can create alert pop-ups to display info or warning messages to the user.
You can perform operations based on user inputs and display the results.
You can validate user inputs before submitting it to the server.
The list does not end here, there are many other interesting things that you can do with
JavaScript. You will learn about all of them in detail in upcoming chapters.
Once you're comfortable with the basics, you'll move on to next level that explains the idea of
objects, the Document Object Model (DOM) and Browser Object Model (BOM), as well as how
to make use of the native JavaScript objects like Date, Math, etc., and perform type
conversions. Finally, you'll explore some advanced concepts like event listeners, event
propagation, borrowing methods from other objects, hoisting behavior of JavaScript,
encoding and decoding JSON data, as well as detailed overview of new features introduced in
ECMAScript 6 (or ES6).
If you're just starting out in the world of web development, start learning from here »
Well, let's get started with the most popular client-side scripting language.
Embedding the JavaScript code between a pair of <script> and </script> tag.
Creating an external JavaScript file with the .js extension and then load it within the
page through the src attribute of the <script> tag.
Placing the JavaScript code directly inside an HTML tag using the special tag attributes
such as onclick, onmouseover, onkeypress, onload, etc.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Embedding JavaScript</title>
</head>
<body>
<script>
var greet = "Hello World!";
document.write(greet); // Prints: Hello World!
</script>
</body>
</html>
The JavaScript code in the above example will simply prints a text message on the web page.
You will learn what each of these JavaScript statements means in upcoming chapters.
Note: The type attribute for <script> tag (i.e. <script type="text/javascript">) is no
longer required since HTML5. JavaScript is the default scripting language for HTML5.
This is useful if you want the same scripts available to multiple documents. It saves you from
repeating the same task over and over again, and makes your website much easier to
maintain.
Well, let's create a JavaScript file named "hello.js" and place the following code in it:
Example
Try this code »
// A function to display a message
function sayHello() {
alert("Hello World!");
}
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Including External JavaScript File</title>
</head>
<body>
<button type="button" id="myBtn">Click Me</button>
<script src="js/hello.js"></script>
</body>
</html>
Note: Usually when an external JavaScript file is downloaded for first time, it is stored in the
browser's cache (just like images and style sheets), so it won't need to be downloaded
multiple times from the web server that makes the web pages load more quickly.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Inlining JavaScript</title>
</head>
<body>
<button onclick="alert('Hello World!')">Click Me</button>
</body>
</html>
The above example will show you an alert message on click of the button element.
Tip: You should always keep the content and structure of your web page (i.e. HTML) separate
out from presentation (CSS), and behavior (JavaScript).
Each <script> tag blocks the page rendering process until it has fully downloaded and
executed the JavaScript code, so placing them in the head section (i.e. <head> element) of the
document without any valid reason will significantly impact your website performance.
Tip: You can place any number of <script> element in a single document. However, they are
processed in the order in which they appear in the document, from top to bottom.
JavaScript Syntax
Understanding the JavaScript Syntax
The syntax of JavaScript is the set of rules that define a correctly structured JavaScript
program.
Example
Try this code »
var x = 5;
var y = 10;
var sum = x + y;
document.write(sum); // Prints variable value
You will learn what each of these statements means in upcoming chapters.
Case Sensitivity in JavaScript
JavaScript is case-sensitive. This means that variables, language keywords, function names,
and other identifiers must always be typed with a consistent capitalization of letters.
For example, the variable myVar must be typed myVar not MyVar or myvar. Similarly, the method
name getElementById() must be typed with the exact case not as getElementByID().
Example
Try this code »
var myVar = "Hello World!";
console.log(myVar);
console.log(MyVar);
console.log(myvar);
If you checkout the browser console by pressing the f12 key on the keyboard, you'll see a line
something like this: "Uncaught ReferenceError: MyVar is not defined".
JavaScript Comments
A comment is simply a line of text that is completely ignored by the JavaScript interpreter.
Comments are usually added with the purpose of providing extra information pertaining to
source code. It will not only help you understand your code when you look after a period of
time but also others who are working with you on the same project.
Example
Try this code »
// This is my first JavaScript program
document.write("Hello World!");
Whereas, a multi-line comment begins with a slash and an asterisk (/*) and ends with an
asterisk and slash (*/). Here's an example of a multi-line comment.
Example
Try this code »
/* This is my first program
in JavaScript */
document.write("Hello World!");
Understanding the JavaScript Syntax
The syntax of JavaScript is the set of rules that define a correctly structured JavaScript
program.
Example
Try this code »
var x = 5;
var y = 10;
var sum = x + y;
document.write(sum); // Prints variable value
You will learn what each of these statements means in upcoming chapters.
For example, the variable myVar must be typed myVar not MyVar or myvar. Similarly, the method
name getElementById() must be typed with the exact case not as getElementByID().
Example
Try this code »
var myVar = "Hello World!";
console.log(myVar);
console.log(MyVar);
console.log(myvar);
If you checkout the browser console by pressing the f12 key on the keyboard, you'll see a line
something like this: "Uncaught ReferenceError: MyVar is not defined".
JavaScript Comments
A comment is simply a line of text that is completely ignored by the JavaScript interpreter.
Comments are usually added with the purpose of providing extra information pertaining to
source code. It will not only help you understand your code when you look after a period of
time but also others who are working with you on the same project.
JavaScript support single-line as well as multi-line comments. Single-line comments begin
with a double forward slash (//), followed by the comment text. Here's an example:
Example
Try this code »
// This is my first JavaScript program
document.write("Hello World!");
Whereas, a multi-line comment begins with a slash and an asterisk (/*) and ends with an
asterisk and slash (*/). Here's an example of a multi-line comment.
Example
Try this code »
/* This is my first program
in JavaScript */
document.write("Hello World!");
You can create a variable with the var keyword, whereas the assignment operator (=) is used to
assign value to a variable, like this: var varName = value;
Example
Try this code »
var name = "Peter Parker";
var age = 21;
var isMarried = false;
Tip: Always give meaningful names to your variables. Additionally, for naming the variables
that contain multiple words, camelCase is commonly used. In this convention all words after
the first should have uppercase first letters, e.g. myLongVariableName.
In the above example we have created three variables, first one has assigned with a string
value, the second one has assigned with a number, whereas the last one assigned with a
boolean value. Variables can hold different types of data, we'll learn about them in later
chapter.
In JavaScript, variables can also be declared without having any initial values assigned to
them. This is useful for variables which are supposed to hold values like user inputs.
Example
Try this code »
// Declaring Variable
var userName;
// Assigning value
userName = "Clark Kent";
Note: In JavaScript, if a variable has been declared, but has not been assigned a value
explicitly, is automatically assigned the value undefined.
Example
Try this code »
// Declaring multiple Variables
var name = "Peter Parker", age = 21, isMarried = false;
The const keyword works exactly the same as let, except that variables declared
using const keyword cannot be reassigned later in the code. Here's an example:
Example
Try this code »
// Declaring variables
let name = "Harry Potter";
let age = 11;
let isStudent = true;
// Declaring constant
const PI = 3.14;
console.log(PI); // 3.14
// Trying to reassign
PI = 10; // error
Unlike var, which declare function-scoped variables, both let and const keywords declare
variables, scoped at block-level ({}). Block scoping means that a new scope is created between
a pair of curly brackets {}. We'll discuss this in detail later, in JavaScript ES6 features chapter.
A variable name must start with a letter, underscore (_), or dollar sign ($).
A variable name cannot start with a number.
A variable name can only contain alpha-numeric characters (A-z, 0-9) and underscores.
A variable name cannot contain spaces.
A variable name cannot be a JavaScript keyword or a JavaScript reserved word.
Note: Variable names in JavaScript are case sensitive, it means $myvar and $myVar are two
different variables. So be careful while defining variable names.
In JavaScript there are several different ways of generating output including writing output to
the browser window or browser console, displaying output in dialog boxes, writing output
into an HTML element, etc. We'll take a closer look at each of these in the following sections.
Example
Try this code »
// Printing a simple text message
console.log("Hello World!"); // Prints: Hello World!
// Printing a variable value
var x = 10;
var y = 20;
var sum = x + y;
console.log(sum); // Prints: 30
Tip: To access your web browser's console, first press F12 key on the keyboard to open
the developer tools then click on the console tab. It looks something like the screenshot here.
Example
Try this code »
// Displaying a simple text message
alert("Hello World!"); // Outputs: Hello World!
Example
Try this code »
// Printing a simple text message
document.write("Hello World!"); // Prints: Hello World!
Example
Try this code »
<h1>This is a heading</h1>
<p>This is a paragraph of text.</p>
Example
Try this code »
<p id="greet"></p>
<p id="result"></p>
<script>
// Writing text string inside an element
document.getElementById("greet").innerHTML = "Hello World!";
Primitive data types can hold only one value at a time, whereas composite data types can hold
collections of values and more complex entities. Let's discuss each one of them in detail.
Example
Try this code »
var a = "Let's have a cup of coffee."; // single quote inside double
quotes
var b = 'He said "Hello" and left.'; // double quotes inside single
quotes
var c = 'We\'ll never give up.'; // escaping single quote with
backslash
You will learn more about the strings in JavaScript strings chapter.
Example
Try this code »
var a = 25; // integer
var b = 80.5; // floating-point number
var c = 4.25e+6; // exponential notation, same as 4.25e6 or 4250000
var d = 4.25e-6; // exponential notation, same as 0.00000425
The Number data type also includes some special values which are: Infinity, -Infinity and NaN.
Infinity represents the mathematical Infinity ∞, which is greater than any number. Infinity is the
result of dividing a nonzero number by 0, as demonstrated below:
Example
Try this code »
alert(16 / 0); // Output: Infinity
alert(-16 / 0); // Output: -Infinity
alert(16 / -0); // Output: -Infinity
While NaN represents a special Not-a-Number value. It is a result of an invalid or an undefined
mathematical operation, like taking the square root of -1 or dividing 0 by 0, etc.
Example
Try this code »
alert("Some text" / 2); // Output: NaN
alert("Some text" / 2 + 10); // Output: NaN
alert(Math.sqrt(-1)); // Output: NaN
You will learn more about the numbers in JavaScript numbers chapter.
Example
Try this code »
var isReading = true; // yes, I'm reading
var isSleeping = false; // no, I'm not sleeping
Boolean values also come as a result of comparisons in a program. The following example
compares two variables and shows the result in an alert dialog box:
Example
Try this code »
var a = 2, b = 5, c = 10;
Example
Try this code »
var a;
var b = "Hello World!"
A variable can be explicitly emptied of its current contents by assigning it the null value.
Example
Try this code »
var a = null;
alert(a); // Output: null
b = null;
alert(b) // Output: null
The following example will show you the simplest way to create an object in JavaScript.
Example
Try this code »
var emptyObject = {};
var person = {"name": "Clark", "surname": "Kent", "age": "36"};
The simplest way to create an array is by specifying the array elements as a comma-separated
list enclosed by square brackets, as shown in the example below:
Example
Try this code »
var colors = ["Red", "Yellow", "Green", "Orange"];
var cities = ["London", "Paris", "New York"];
Example
Try this code »
var greeting = function(){
return "Hello World!";
}
Example
Try this code »
function createGreeting(name){
return "Hello, " + name;
}
function displayGreeting(greetingFunction, userName){
return greetingFunction(userName);
}
The typeof operator is particularly useful in the situations when you need to process the values
of different types differently, but you need to be very careful, because it may produce
unexpected result in some cases, as demonstrated in the following example:
Example
Try this code »
// Numbers
typeof 15; // Returns: "number"
typeof 42.7; // Returns: "number"
typeof 2.5e-4; // Returns: "number"
typeof Infinity; // Returns: "number"
typeof NaN; // Returns: "number". Despite being "Not-A-Number"
// Strings
typeof ''; // Returns: "string"
typeof 'hello'; // Returns: "string"
typeof '12'; // Returns: "string". Number within quotes is typeof string
// Booleans
typeof true; // Returns: "boolean"
typeof false; // Returns: "boolean"
// Undefined
typeof undefined; // Returns: "undefined"
typeof undeclaredVariable; // Returns: "undefined"
// Null
typeof Null; // Returns: "object"
// Objects
typeof {name: "John", age: 18}; // Returns: "object"
// Arrays
typeof [1, 2, 4]; // Returns: "object"
// Functions
typeof function(){}; // Returns: "function"
As you can clearly see in the above example when we test the null value using
the typeof operator (line no-22), it returned "object" instead of "null". This is a long-standing
bug in JavaScript, but since lots of codes on the web written around this behavior, and thus
fixing it would create a lot more problem, so idea of fixing this issue was rejected by the
committee that design and maintains JavaScript.
The following example will show you these arithmetic operators in action:
Example
Try this code »
var x = 10;
var y = 4;
alert(x + y); // 0utputs: 14
alert(x - y); // 0utputs: 6
alert(x * y); // 0utputs: 40
alert(x / y); // 0utputs: 2.5
alert(x % y); // 0utputs: 2
= Assign x = y x = y
The following example will show you these assignment operators in action:
Example
Try this code »
var x; // Declaring Variable
x = 10;
alert(x); // Outputs: 10
x = 20;
x += 30;
alert(x); // Outputs: 50
x = 50;
x -= 20;
alert(x); // Outputs: 30
x = 5;
x *= 25;
alert(x); // Outputs: 125
x = 50;
x /= 10;
alert(x); // Outputs: 5
x = 100;
x %= 15;
alert(x); // Outputs: 10
The following example will show you these string operators in action:
Example
Try this code »
var str1 = "Hello";
var str2 = " World!";
str1 += str2;
alert(str1); // Outputs: Hello World!
The following example will show you how increment and decrement operators actually work:
Example
Try this code »
var x; // Declaring Variable
x = 10;
alert(++x); // Outputs: 11
alert(x); // Outputs: 11
x = 10;
alert(x++); // Outputs: 10
alert(x); // Outputs: 11
x = 10;
alert(--x); // Outputs: 9
alert(x); // Outputs: 9
x = 10;
alert(x--); // Outputs: 10
alert(x); // Outputs: 9
The following example will show you how these logical operators actually work:
Example
Try this code »
var year = 2018;
// Leap years are divisible by 400 or by 4 but not 100
if((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))){
alert(year + " is a leap year.");
} else{
alert(year + " is not a leap year.");
}
=== Identical x === y True if x is equal to y, and they are of the same type
!== Not identical x !== y True if x is not equal to y, or they are not of the same type
The following example will show you these comparison operators in action:
Example
Try this code »
var x = 25;
var y = 35;
var z = "25";
When an event occur, you can use a JavaScript event handler (or an event listener) to detect
them and perform specific task or set of tasks. By convention, the names for event handlers
always begin with the word "on", so an event handler for the click event is called onclick,
similarly an event handler for the load event is called onload, event handler for the blur event is
called onblur, and so on.
There are several ways to assign an event handler. The simplest way is to add them directly to
the start tag of the HTML elements using the special event-handler attributes. For example, to
assign a click handler for a button element, we can use onclick attribute, like this:
Example
Try this code »
<button type="button" onclick="alert('Hello World!')">Click Me</button>
However, to keep the JavaScript seperate from HTML, you can set up the event handler in an
external JavaScript file or within the <script> and </script> tags, like this:
Example
Try this code »
<button type="button" id="myBtn">Click Me</button>
<script>
function sayHello() {
alert('Hello World!');
}
document.getElementById("myBtn").onclick = sayHello;
</script>
Note: Since HTML attributes are case-insensitive so onclick may also be written
as onClick, OnClick or ONCLICK. But its value is case-sensitive.
In general, the events can be categorized into four main groups — mouse events, keyboard
events, form events and document/window events. There are many other events, we will learn
about them in later chapters. The following section will give you a brief overview of the most
useful events one by one along with the real life practice examples.
Mouse Events
A mouse event is triggered when the user click some element, move the mouse pointer over
an element, etc. Here're some most important mouse events and their event handler.
The following example will show you an alert message when you click on the elements.
Example
Try this code »
<button type="button" onclick="alert('You have clicked a button!');">Click
Me</button>
<a href="#" onclick="alert('You have clicked a link!');">Click Me</a>
The following example will show an alert message when you right-click on the elements.
Example
Try this code »
<button type="button" oncontextmenu="alert('You have right-clicked a
button!');">Right Click on Me</button>
<a href="#" oncontextmenu="alert('You have right-clicked a link!');">Right
Click on Me</a>
You can handle the mouseover event with the onmouseover event handler. The following
example will show you an alert message when you place mouse over the elements.
Example
Try this code »
<button type="button" onmouseover="alert('You have placed mouse pointer
over a button!');">Place Mouse Over Me</button>
<a href="#" onmouseover="alert('You have placed mouse pointer over a
link!');">Place Mouse Over Me</a>
You can handle the mouseout event with the onmouseout event handler. The following example
will show you an alert message when the mouseout event occurs.
Example
Try this code »
<button type="button" onmouseout="alert('You have moved out of the
button!');">Place Mouse Inside Me and Move Out</button>
<a href="#" onmouseout="alert('You have moved out of the link!');">Place
Mouse Inside Me and Move Out</a>
Keyboard Events
A keyboard event is fired when the user press or release a key on the keyboard. Here're some
most important keyboard events and their event handler.
You can handle the keydown event with the onkeydown event handler. The following example
will show you an alert message when the keydown event occurs.
Example
Try this code »
<input type="text" onkeydown="alert('You have pressed a key inside text
input!')">
<textarea onkeydown="alert('You have pressed a key inside
textarea!')"></textarea>
You can handle the keyup event with the onkeyup event handler. The following example will
show you an alert message when the keyup event occurs.
Example
Try this code »
<input type="text" onkeyup="alert('You have released a key inside text
input!')">
<textarea onkeyup="alert('You have released a key inside
textarea!')"></textarea>
You can handle the keypress event with the onkeypress event handler. The following example
will show you an alert message when the keypress event occurs.
Example
Try this code »
<input type="text" onkeypress="alert('You have pressed a key inside text
input!')">
<textarea onkeypress="alert('You have pressed a key inside
textarea!')"></textarea>
Form Events
A form event is fired when a form control receive or loses focus or when the user modify a
form control value such as by typing text in a text input, select any option in a select box etc.
Here're some most important form events and their event handler.
You can handle the focus event with the onfocus event handler. The following example will
highlight the background of text input in yellow color when it receives the focus.
Example
Try this code »
<script>
function highlightInput(elm){
elm.style.background = "yellow";
}
</script>
<input type="text" onfocus="highlightInput(this)">
<button type="button">Button</button>
Note: The value of this keyword inside an event handler refers to the element which has the
handler on it (i.e. where the event is currently being delivered).
You can handle the blur event with the onblur event handler. The following example will show
you an alert message when the text input element loses focus.
Example
Try this code »
<input type="text" onblur="alert('Text input loses focus!')">
<button type="button">Submit</button>
To take the focus away from a form element first click inside of it then press the tab key on
the keyboard, give focus on something else, or click outside of it.
You can handle the change event with the onchange event handler. The following example will
show you an alert message when you change the option in the select box.
Example
Try this code »
<select onchange="alert('You have changed the selection!');">
<option>Select</option>
<option>Male</option>
<option>Female</option>
</select>
You can handle the submit event with the onsubmit event handler. The following example will
show you an alert message while submitting the form to the server.
Example
Try this code »
<form action="action.php" method="post" onsubmit="alert('Form data will be
submitted to the server!');">
<label>First Name:</label>
<input type="text" name="first-name" required>
<input type="submit" value="Submit">
</form>
Document/Window Events
Events are also triggered in situations when the page has loaded or when user resize the
browser window, etc. Here're some most important document/window events and their event
handler.
You can handle the load event with the onload event handler. The following example will show
you an alert message as soon as the page finishes loading.
Example
Try this code »
<body onload="window.alert('Page is loaded successfully!');">
<h1>This is a heading</h1>
<p>This is paragraph of text.</p>
</body>
You can handle the unload event with the onunload event handler. The following example will
show you an alert message when you try to leave the page.
Example
Try this code »
<body onunload="alert('Are you sure you want to leave this page?');">
<h1>This is a heading</h1>
<p>This is paragraph of text.</p>
</body>
The Resize Event (onresize)
The resize event occurs when a user resizes the browser window. The resize event also occurs
in situations when the browser window is minimized or maximized.
You can handle the resize event with the onresize event handler. The following example will
show you an alert message when you resize the browser window to a new width and height.
Example
Try this code »
<p id="result"></p>
<script>
function displayWindowSize() {
var w = window.outerWidth;
var h = window.outerHeight;
var txt = "Window size: width=" + w + ", height=" + h;
document.getElementById("result").innerHTML = txt;
}
window.onresize = displayWindowSize;
</script>
Example
Try this code »
var myString = 'Hello World!'; // Single quoted string
var myString = "Hello World!"; // Double quoted string
You can use quotes inside a string, as long as they don't match the quotes surrounding the
string:
Example
Try this code »
var str1 = "it's okay";
var str2 = 'He said "Goodbye"';
var str3 = "She replied 'Calm down, please'";
var str4 = 'Hi, there!"; // Syntax error - quotes must match
However, you can still use single quotes inside a single quoted strings or double quotes inside
double quoted strings by escaping the quotes with a backslash character ( \), like this:
Example
Try this code »
var str1 = 'it\'s okay';
var str2 = "He said \"Goodbye\"";
var str3 = 'She replied \'Calm down, please\'';
The backslash (\) is called an escape character, whereas the sequences \' and \" that we've
used in the example above are called escape sequences.
Example
Try this code »
var str1 = "The quick brown fox \n jumps over the lazy dog.";
document.write("<pre>" + str1 + "</pre>"); // Create line break
JavaScript making it possible by creating a temporary wrapper object for primitive data types.
This process is done automatically by the JavaScript interpreter in the background.
Getting the Length of a String
The length property returns the length of the string, which is the number of characters
contained in the string. This includes the number of special characters as well, such as \t or \n.
Example
Try this code »
var str1 = "This is a paragraph of text.";
document.write(str1.length); // Prints 28
Example
Try this code »
var str = "If the facts don't fit the theory, change the facts.";
var pos = str.indexOf("facts");
alert(pos); // 0utputs: 7
Similarly, you can use the lastIndexOf() method to get the index or position of the last
occurrence of the specified string within a string, like this:
Example
Try this code »
var str = "If the facts don't fit the theory, change the facts.";
var pos = str.lastIndexOf("facts");
alert(pos); // 0utputs: 46
Both the indexOf(), and the lastIndexOf() methods return -1 if the substring is not found. Both
methods also accept an optional integer parameter which specifies the position within the
string at which to start the search. Here's an example:
Example
Try this code »
var str = "If the facts don't fit the theory, change the facts.";
// Searching forwards
var pos1 = str.indexOf("facts", 20);
alert(pos1); // 0utputs: 46
// Searching backwards
var pos2 = str.lastIndexOf("facts", 20);
alert(pos2); // 0utputs: 7
Note: Characters in a string are indexed from left to right. The index of the first character is 0,
and the index of the last character of a string called myStr is myStr.length - 1.
Like indexOf() method the search() method also returns the index of the first match, and
returns -1 if no matches were found, but unlike indexOf() method this method can also take
a regular expression as its argument to provide advanced search capabilities.
Example
Try this code »
var str = "Color red looks brighter than color blue.";
You will learn more about regular expressions in the upcoming chapters.
This method takes 2 parameters: start index (index at which to begin extraction), and an
optional end index (index before which to end extraction), like str.slice(startIndex, endIndex).
The following example slices out a portion of a string from position 4 to position 15:
Example
Try this code »
var str = "The quick brown fox jumps over the lazy dog.";
var subStr = str.slice(4, 15);
document.write(subStr); // Prints: quick brown
You can also specify negative values. The negative value is treated as strLength + startIndex,
where strLength is the length of the string (i.e. str.length), for example, if startIndex is -5 it is
treated as strLength - 5. If startIndex is greater than or equal to the length of the
string, slice() method returns an empty string. Also, if optional endIndex is not specified or
omitted, the slice() method extracts to the end of the string.
Example
Try this code »
var str = "The quick brown fox jumps over the lazy dog.";
document.write(str.slice(-28, -19)); // Prints: fox jumps
document.write(str.slice(31)); // Prints: the lazy dog.
You can also use the substring() method to extract a section of the given string based on start
and end indexes, like str.substring(startIndex, endIndex) . The substring() method is very similar
to the slice() method, except few differences:
The following example will show you how this method actuallty works:
Example
Try this code »
var str = "The quick brown fox jumps over the lazy dog.";
document.write(str.substring(4, 15)); // Prints: quick brown
document.write(str.substring(9, 0)); // Prints: The quick
document.write(str.substring(-28, -19)); // Prints nothing
document.write(str.substring(31)); // Prints: the lazy dog.
This replace() method returns a new string, it doesn't affect the original string that will remain
unchanged. The following example will show you how it works:
Example
Try this code »
var str = "Color red looks brighter than color blue.";
var result = str.replace("color", "paint");
alert(result); // 0utputs: Color red looks brighter than paint blue.
By default, the replace() method replaces only the first match, and it is case-sensitive. To
replace the substring within a string in a case-insensitive manner you can use a regular
expression (regexp) with an i modifier, as shown in the example below:
Example
Try this code »
var str = "Color red looks brighter than color blue.";
var result = str.replace(/color/i, "paint");
alert(result); // 0utputs: paint red looks brighter than color blue.
Similarly, to replace all the occurrences of a substring within a string in a case-insensitive
manner you can use the g modifier along with the i modifier, like this:
Example
Try this code »
var str = "Color red looks brighter than color blue.";
var result = str.replace(/color/ig, "paint");
alert(result); // 0utputs: paint red looks brighter than paint blue.
Converting a String to Uppercase or Lowercase
You can use the toUpperCase() method to convert a string to uppercase, like this:
Example
Try this code »
var str = "Hello World!";
var result = str.toUpperCase();
document.write(result); // Prints: HELLO WORLD!
Similarly, you can use the toLowerCase() to convert a string to lowercase, like this:
Example
Try this code »
var str = "Hello World!";
var result = str.toLowerCase();
document.write(result); // Prints: hello world!
Example
Try this code »
var hello = "Hello";
var world = "World";
var greet = hello + " " + world;
document.write(greet); // Prints: Hello World
Example
Try this code »
var str = "Hello World!";
document.write(str.charAt()); // Prints: H
document.write(str.charAt(6)); // Prints: W
document.write(str.charAt(30)); // Prints nothing
document.write(str.charAt(str.length - 1)); // Prints: !
There is even better way to do this. Since ECMAScript 5, strings can be treated like read-only
arrays, and you can access individual characters from a string using square brackets ([])
instead of the charAt() method, as demonstrated in the following example:
Example
Try this code »
var str = "Hello World!";
document.write(str[0]); // Prints: H
document.write(str[6]); // Prints: W
document.write(str[str.length - 1]); // Prints: !
document.write(str[30]); // Prints: undefined
Note: The only difference between accessing the character from a string using
the charAt() and square bracket ([]) is that if no character is found, [] returns undefined,
whereas the charAt() method returns an empty string.
If separator argument is omitted or not found in the specified string, the entire string is
assigned to the first element of the array. The following example shows how it works:
Example
Try this code »
var fruitsStr = "Apple, Banana, Mango, Orange, Papaya";
var fruitsArr = fruitsStr.split(", ");
document.write(fruitsArr[0]); // Prints: Apple
document.write(fruitsArr[2]); // Prints: Mango
document.write(fruitsArr[fruitsArr.length - 1]); // Prints: Papaya
Example
Try this code »
var str = "INTERSTELLAR";
var strArr = str.split("");
document.write(strArr[0]); // Prints: I
document.write(strArr[1]); // Prints: N
document.write(strArr[strArr.length - 1]); // Prints: R
// Loop through all the elements of the characters array and print them
for(var i in strArr) {
document.write("<br>" + strArr[i]);
Example
Try this code »
var x = 2; // integer number
var y = 3.14; // floating-point number
var z = 0xff; // hexadecimal number
Extra large numbers can be represented in exponential notation e.g. 6.02e+23 (same as
6.02x1023).
Example
Try this code »
var x = 1.57e4; // same as 15700
var y = 4.25e+6; // same as 4.25e6 or 4250000
var z = 4.25e-6; // same as 0.00000425
Tip: The biggest safe integer in JavaScript is 9007199254740991 (253-1), whereas the smallest safe
integer is -9007199254740991 (-(253-1)).
Numbers can also be represented in hexadecimal notation (base 16). Hexadecimal numbers
are prefixed with 0x. They are commonly used to represent colors. Here's an example:
Example
Try this code »
var x = 0xff; // same as 255
var y = 0xb4; // same as 180
var z = 0x00; // same as 0
Note: Integers can be represented in decimal, hexadecimal, and octal notation. Floating-point
numbers can be represented in decimal or exponential notation.
Operating on Numbers and Strings
As you know from the previous chapters, the + operator is used for both addition and
concatenation. So, performing mathematical operations on numbers and strings may produce
interesting results. The following example will show you what happens when you add
numbers and strings:
Example
Try this code »
var x = 10;
var y = 20;
var z = "30";
But, if you perform other mathematical operations like multiplication, division, or subtraction
the result will be different. JavaScript will automatically convert numeric strings (i.e. strings
containing numeric values) to numbers in all numeric operations, as shown in the following
example:
Example
Try this code »
var x = 10;
var y = 20;
var z = "30";
Example
Try this code »
var x = 10;
var y = "foo";
var z = NaN;
Representing Infinity
Infinity represents a number too big for JavaScript to handle. JavaScript has special
keyword Infinity and -Infinity to represent positive and negative infinity respectively. For
example, dividing by 0 returns Infinity, as demonstrated below:
Example
Try this code »
var x = 5 / 0;
console.log(x); // Infinity
var y = -5 / 0;
console.log(y); // -Infinity
Note: Infinity is a special value that represents the mathematical Infinity ∞, which is greater
than any number. The typeof operator return number for an Infinity value.
Example
Try this code »
var x = 0.1 + 0.2;
console.log(x) // 0.30000000000000004
As you can see the result is 0.30000000000000004 rather than the expected 0.3. This difference is
called representation error or roundoff error. It occurs because JavaScript and many other
languages uses binary (base 2) form to represent decimal (base 10) numbers internally.
Unfortunately, most decimal fractions can't be represented exactly in binary form, so small
differences occur.
To avoid this problem you can use the solution something like this:
Example
Try this code »
var x = (0.1 * 10 + 0.2 * 10) / 10;
console.log(x) // 0.3
JavaScript round floating-point numbers to 17 digits, which is enough precision or accuracy in
most cases. Also, in JavaScript integers (numbers without fractional parts or exponential
notation) are accurate is up to 15 digits, as demonstrated in the following example:
Example
Try this code »
var x = 999999999999999;
console.log(x); // 999999999999999
var y = 9999999999999999;
console.log(y); // 10000000000000000
Performing Operations on Numbers
JavaScript provides several properties and methods to perform operations on number values.
As you already know from the previous chapters, in JavaScript primitive data types can act like
objects when you refer to them with the property access notation (i.e. dot notation).
In the following sections, we will look at the number methods that are most commonly used.
If the parseInt() method encounters a character that is not numeric in the specified base, it
stops parsing and returns the integer value parsed up to that point. If the first character
cannot be converted into a number, the method will return NaN (not a number).
Example
Try this code »
console.log(parseInt("3.14")); // 3
console.log(parseInt("50px")); // 50
console.log(parseInt("12pt")); // 12
console.log(parseInt("0xFF", 16)); // 255
console.log(parseInt("20 years")); // 20
console.log(parseInt("Year 2048")); // NaN
console.log(parseInt("10 12 2018")); // 10
Note: The parseInt() method truncates numbers to integer values, but it should not be used
as a substitute for Math.floor() method.
Similarly, you can use the parseFloat() method to parse floating-point number from a string.
The parseFloat() method works the same way as the parseInt() method, except that it retrieves
both integers and numbers with decimals.
Example
Try this code »
console.log(parseFloat("3.14")); // 3.14
console.log(parseFloat("50px")); // 50
console.log(parseFloat("1.6em")); // 1.6
console.log(parseFloat("124.5 lbs")); // 124.5
console.log(parseFloat("weight 124.5 lbs")); // NaN
console.log(parseFloat("6.5 acres")); // 6.5
Converting Numbers to Strings
The toString() method can be used to convert a number to its string equivalent. This method
optionally accepts an integer parameter in the range 2 through 36 specifying the base to use
for representing numeric values. Here's an example:
Example
Try this code »
var x = 10;
var y = x.toString();
console.log(y); // '10'
console.log(typeof y); // string
console.log(typeof x); // number
console.log((12).toString()); // '12'
console.log((15.6).toString()); // '15.6'
console.log((6).toString(2)); // '110'
console.log((255).toString(16)); // 'ff'
Example
Try this code »
var x = 67.1234;
console.log(x.toExponential()); // 6.71234e+1
console.log(x.toExponential(6)); // 6.712340e+1
console.log(x.toExponential(4)); // 6.7123e+1
console.log(x.toExponential(2)); // 6.71e+1
Note: Exponential notation is useful for representing numbers that are either very large or
very small in magnitude. For example, 62500000000 can be written as 625e+8 or 6.25e+10.
var y = 6.25e+5;
console.log(y.toFixed(2)); // '625000.00'
var z = 1.58e-4;
console.log(z.toFixed(2)); // '0.00' (since 1.58e-4 is equal to 0.000158)
If precision is large enough to include all the digits of the integer part of number, then the
number is formatted using fixed-point notation. Otherwise, the number is formatted using
exponential notation. The precision parameter is optional. Here's an example:
Example
Try this code »
var x = 6.235;
console.log(x.toPrecision()); // '6.235'
console.log(x.toPrecision(3)); // '6.24' (note rounding)
console.log(x.toPrecision(2)); // '6.2'
console.log(x.toPrecision(1)); // '6'
var y = 47.63;
console.log(y.toPrecision(2)); // '48' (note rounding, no fractional part)
var z = 1234.5;
console.log(z.toPrecision(2)); // '1.2e+3'
Example
Try this code »
var a = Number.MAX_VALUE;
console.log(a); // 1.7976931348623157e+308
var b = Number.MIN_VALUE;
console.log(b); // 5e-324
var x = Number.MAX_VALUE * 2;
console.log(x); // Infinity
var y = -1 * Number.MAX_VALUE * 2;
console.log(y); // -Infinity
There are several conditional statements in JavaScript that you can use to make decisions:
The if statement
The if...else statement
The if...else if....else statement
The switch...case statement
The if Statement
The if statement is used to execute a block of code only if the specified condition evaluates to
true. This is the simplest JavaScript's conditional statements and can be written like:
if(condition) {
// Code to be executed
}
The following example will output "Have a nice weekend!" if the current day is Friday:
Example
Try this code »
var now = new Date();
var dayOfWeek = now.getDay(); // Sunday - Saturday : 0 - 6
if(dayOfWeek == 5) {
alert("Have a nice weekend!");
}
The if...else statement allows you to execute one block of code if the specified condition is
evaluates to true and another block of code if it is evaluates to false. It can be written, like this:
if(condition) {
// Code to be executed if condition is true
} else {
// Code to be executed if condition is false
}
The JavaScript code in the following example will output "Have a nice weekend!" if the current
day is Friday, otherwise it will output the text "Have a nice day!".
Example
Try this code »
var now = new Date();
var dayOfWeek = now.getDay(); // Sunday - Saturday : 0 - 6
if(dayOfWeek == 5) {
alert("Have a nice weekend!");
} else {
alert("Have a nice day!");
}
if(condition1) {
// Code to be executed if condition1 is true
} else if(condition2) {
// Code to be executed if the condition1 is false and condition2 is true
} else {
// Code to be executed if both condition1 and condition2 are false
}
The following example will output "Have a nice weekend!" if the current day is Friday, and
"Have a nice Sunday!" if the current day is Sunday, otherwise it will output "Have a nice day!"
Example
Try this code »
var now = new Date();
var dayOfWeek = now.getDay(); // Sunday - Saturday : 0 - 6
if(dayOfWeek == 5) {
alert("Have a nice weekend!");
} else if(dayOfWeek == 0) {
alert("Have a nice Sunday!");
} else {
alert("Have a nice day!");
}
You will learn about the JavaScript switch-case statement in the next chapter.
If the condition is evaluated to true the value1 will be returned, otherwise value2 will be
returned. To understand how this operator works, consider the following examples:
Example
Try this code »
var userType;
var age = 21;
if(age < 18) {
userType = 'Child';
} else {
userType = 'Adult';
}
alert(userType); // Displays Adult
Using the ternary operator the same code could be written in a more compact way:
Example
Try this code »
var age = 21;
var userType = age < 18 ? 'Child' : 'Adult';
alert(userType); // Displays Adult
As you can see in the above example, since the specified condition evaluated to false the
value on the right side of the colon (:) is returned, which is the string 'Adult'.
Tip: Code written using the ternary operator can be difficult to read sometimes. However, it
provides a great way to write compact if-else statements.
switch(x){
case value1:
// Code to be executed if x === value1
break;
case value2:
// Code to be executed if x === value2
break;
...
default:
// Code to be executed if x is different from all values
}
Consider the following example, which display the name of the day of the week.
Example
Try this code »
var d = new Date();
switch(d.getDay()) {
case 0:
alert("Today is Sunday.");
break;
case 1:
alert("Today is Monday.");
break;
case 2:
alert("Today is Tuesday.");
break;
case 3:
alert("Today is Wednesday.");
break;
case 4:
alert("Today is Thursday.");
break;
case 5:
alert("Today is Friday.");
break;
case 6:
alert("Today is Saturday.");
break;
default:
alert("No information available for that day.");
break;
}
The getDay() method returns the weekday as a number from 0 and 6, where 0 represents
Sunday. See the JavaScript date and time chapter to learn more about date methods.
Note: In a switch...case statement, the value of the expression or variable is compared against
the case value using the strict equality operator (===). That means if x = "0", it doesn't
match case 0:, because their data types are not equal.
The switch...case statement differs from the if...else statement in one important way. The switch
statement executes line by line (i.e. statement by statement) and once JavaScript finds
a case clause that evaluates to true, it's not only executes the code corresponding to that case
clause, but also executes all the subsequent case clauses till the end of the switch block
automatically. To prevent this you must include a break statement after each case (as you can
see in the above example). The break statement tells the JavaScript interpreter to break out of
the switch...case statement block once it executes the code associated with the first true case.
The break statement is however not required for the case or default clause, when it appears at
last in a switch statement. Though, it a good programming practice to terminate the last case,
or default clause in a switch statement with a break. It prevents a possible programming error
later if another case statement is added to the switch statement. The default clause is optional,
which specify actions to be performed if no case matches the switch expression.
The default clause does not have to be the last clause to appear in a switch statement. Here's
an example, where default is not the last clause.
Example
Try this code »
var d = new Date();
switch(d.getDay()) {
default:
alert("Looking forward to the weekend.");
break;
case 6:
alert("Today is Saturday.");
break;
case 0:
alert("Today is Sunday.");
}
Example
Try this code »
var d = new Date();
switch(d.getDay()) {
case 1:
case 2:
case 3:
case 4:
case 5:
alert("It is a weekday.");
break;
case 0:
case 6:
alert("It is a weekend day.");
break;
default:
alert("Enjoy every day of your life.");
}
Creating an Array
The simplest way to create an array in JavaScript is enclosing a comma-separated list of values
in square brackets ([]), as shown in the following syntax:
var myArray = [element0, element1, ..., elementN];
Array can also be created using the Array() constructor as shown in the following syntax.
However, for the sake of simplicity previous syntax is recommended.
var myArray = new Array(element0, element1, ..., elementN);
Here are some examples of arrays created using array literal syntax:
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
var cities = ["London", "Paris", "New York"];
var person = ["John", "Wick", 32];
Note: An array is an ordered collection of values. Each value in an array is called an element,
and each element has a numeric position in an array, known as its index.
Array indexes are zero-based. This means that the first item of an array is stored at index 0,
not 1, the second item is stored at index 1, and so on. Array indexes start at 0 and go up to
the number of elements minus 1. So, array of five elements would have indexes from 0 to 4.
The following example will show you how to get individual array element by their index.
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
document.write(fruits.length); // Prints: 5
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
colors.push("Yellow");
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
colors.unshift("Yellow");
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
colors.push("Pink", "Voilet");
colors.unshift("Yellow", "Grey");
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
var last = colors.pop();
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
var first = colors.shift();
This method takes three parameters: the first parameter is the index at which to start splicing
the array, it is required; the second parameter is the number of elements to remove (use 0 if
you don't want to remove any elements), it is optional; and the third parameter is a set of
replacement elements, it is also optional. The following example shows how it works:
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
var removed = colors.splice(0,1); // Remove the first element
Example
Try this code »
var colors = ["Red", "Green", "Blue"];
document.write(colors.toString()); // Prints: Red,Green,Blue
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
var subarr = fruits.slice(1, 3);
document.write(subarr); // Prints: Banana,Mango
If endIndex parameter is omitted, all elements to the end of the array are extracted. You can
also specify negative indexes or offsets —in that case the slice() method extract the elements
from the end of an array, rather then the begining. For example:
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
Example
Try this code »
var pets = ["Cat", "Dog", "Parrot"];
var wilds = ["Tiger", "Wolf", "Zebra"];
Example
Try this code »
var pets = ["Cat", "Dog", "Parrot"];
var wilds = ["Tiger", "Wolf", "Zebra"];
var bugs = ["Ant", "Bee"];
Example
Try this code »
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
document.write(fruits.indexOf("Apple")); // Prints: 0
document.write(fruits.indexOf("Banana")); // Prints: 1
document.write(fruits.indexOf("Pineapple")); // Prints: -1
Both methods also accept an optional integer parameter from index which specifies the index
within the array at which to start the search. Here's an example:
Example
Try this code »
var arr = [1, 0, 3, 1, false, 5, 1, 4, 7];
Example
Try this code »
var arr = [1, 0, 3, 1, false, 5, 1, 4, 7];
Example
Try this code »
var arr = [1, 0, 3, 1, false, 5, 1, 4, 7];
Example
Try this code »
var arr = [1, 0, 3, 1, false, 5, 1, 4, 7];
The filter() method creates a new array with all the elements that successfully passes the
given test. The following example will show you how this actually works:
Example
Try this code »
var arr = [1, 0, 3, 1, false, 5, 1, 4, 7];
The JavaScript Array object has a built-in method sort() for sorting array elements in
alphabetical order. The following example demonstrates how it works:
Example
Try this code »
var fruits = ["Banana", "Orange", "Apple", "Papaya", "Mango"];
var sorted = fruits.sort();
Reversing an Array
You can use the reverse() method to reverse the order of the elements of an array.
This method reverses an array in such a way that the first array element becomes the last, and
the last array element becomes the first. Here's an example:
Example
Try this code »
var counts = ["one", "two", "three", "four", "five"];
var reversed = counts.reverse();
Example
Try this code »
var numbers = [5, 20, 10, 75, 50, 100];
numbers.sort(); // Sorts numbers array
alert(numbers); // Outputs: 10,100,20,5,50,75
As you can see, the result is different from what we've expected. It happens because,
the sort() method sorts the numeric array elements by converting them to strings (i.e. 20
becomes "20", 100 becomes "100", and so on), and since the first character of string "20" (i.e.
"2") comes after the first character of string "100" (i.e. "1"), that's why the value 20 is sorted
after the 100.
To fix this sorting problem with numeric array, you can pass a compare function, like this:
Example
Try this code »
var numbers = [5, 20, 10, 75, 50, 100];
When compare function is specified, array elements are sorted according to the return value
of the compare function. For example, when comparing a and b:
If the compare function returns a value less than 0, then a comes first.
If the compare function returns a value greater than 0, then b comes first.
If the compare function returns 0, a and b remain unchanged with respect to each other,
but sorted with respect to all other elements.
Hence, since 5 - 20 = -15 which is less than 0, therefore 5 comes first, similarly 20 - 10 =
10 which is greater than 0, therefore 10 comes before 20, likewise 20 - 75 = -55 which is less
than 0, so 20 comes before 75, similarly 50 comes before 75, and so on.
Example
Try this code »
var numbers = [3, -7, 10, 8, 15, 2];
alert(findMax(numbers)); // Outputs: 15
alert(findMin(numbers)); // Outputs: -7
The apply() method provides a convenient way to pass array values as arguments to a
function that accepts multiple arguments in an array-like manner, but not an array
(e.g. Math.max() and Math.min() methods here). So, the resulting statement Math.max.apply(null,
numbers) in the example above is equivalent to the Math.max(3, -7, 10, 8, 15, 2).
The following example will show you how to sort an array of objects by property values:
Example
Try this code »
var persons = [
{ name: "Harry", age: 14 },
{ name: "Ethan", age: 30 },
{ name: "Peter", age: 21 },
{ name: "Clark", age: 42 },
{ name: "Alice", age: 16 }
];
// Sort by age
persons.sort(function (a, b) {
return a.age - b.age;
});
console.log(persons);
// Sort by name
persons.sort(function(a, b) {
var x = a.name.toLowerCase(); // ignore upper and lowercase
var y = b.name.toLowerCase(); // ignore upper and lowercase
if(x < y) {
return -1;
}
if(x > y) {
return 1;
}
// names must be equal
return 0;
});
console.log(persons);
JavaScript Loops
Different Types of Loops in JavaScript
Loops are used to execute the same block of code again and again, as long as a certain
condition is met. The basic idea behind a loop is to automate the repetitive tasks within a
program to save the time and effort. JavaScript now supports five different types of loops:
while — loops thru a block of code as long as the condition specified evaluates to true.
do…while — loops through a block of code once; then the condition is evaluated. If the
condition is true, the statement is repeated as long as the specified condition is true.
for — loops through a block of code until the counter reaches a specified number.
for…in — loops through the properties of an object.
for…of — loops over iterable objects such as arrays, strings, etc.
In the following sections, we will discuss each of these loop statements in detail.
The following example defines a loop that will continue to run as long as the variable i is less
than or equal to 5. The variable i will increase by 1 each time the loop runs:
Example
Try this code »
var i = 1;
while(i <= 5) {
document.write("<p>The number is " + i + "</p>");
i++;
}
Note: Make sure that the condition specified in your loop eventually goes false. Otherwise,
the loop will never stop iterating which is known as infinite loop. A common mistake is to
forget to increment the counter variable (variable i in our case).
The JavaScript code in the following example defines a loop that starts with i=1. It will then
print the output and increase the value of variable i by 1. After that the condition is evaluated,
and the loop will continue to run as long as the variable i is less than, or equal to 5.
Example
Try this code »
var i = 1;
do {
document.write("<p>The number is " + i + "</p>");
i++;
}
while(i <= 5);
Difference Between while and do...while Loop
The while loop differs from the do-while loop in one important way — with a while loop, the
condition to be evaluated is tested at the beginning of each loop iteration, so if the
conditional expression evaluates to false, the loop will never be executed.
With a do-while loop, on the other hand, the loop will always be executed once even if the
conditional expression evaluates to false, because unlike the while loop, the condition is
evaluated at the end of the loop iteration rather than the beginning.
The following example defines a loop that starts with i=1. The loop will continued until the
value of variable i is less than or equal to 5. The variable i will increase by 1 each time the
loop runs:
Example
Try this code »
for(var i=1; i<=5; i++) {
document.write("<p>The number is " + i + "</p>");
}
The for loop is particularly useful for iterating over an array. The following example will show
you how to print each item or element of the JavaScript array.
Example
Try this code »
// An array with some elements
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
// Loop through all the elements in the array
for(var i=0; i<fruits.length; i++) {
document.write("<p>" + fruits[i] + "</p>");
}
The loop counter i.e. variable in the for-in loop is a string, not a number. It contains the name
of current property or the index of the current array element.
The following example will show you how to loop through all properties of a JavaScript object.
Example
Try this code »
// An object with some properties
var person = {"name": "Clark", "surname": "Kent", "age": "36"};
Example
Try this code »
// An array with some elements
var fruits = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
The following example will show you how to loop through arrays and strings using this loop.
Example
Try this code »
// Iterating over array
let letters = ["a", "b", "c", "d", "e", "f"];
Note: The for...of loop doesn't work with objects because they are not iterable. If you want
to iterate over the properties of an object you can use the for-in loop.
Functions reduces the repetition of code within a program — Function allows you to
extract commonly used block of code into a single component. Now you can perform the
same task by calling this function wherever you want within your script without having to
copy and paste the same block of code again and again.
Functions makes the code much easier to maintain — Since a function created once can
be used many times, so any changes made inside a function automatically implemented at
all the places without touching the several files.
Functions makes it easier to eliminate the errors — When the program is subdivided
into functions, if any error occur you know exactly what function causing the error and
where to find it. Therefore, fixing errors becomes much easier.
The following section will show you how to define and call functions in your scripts.
Example
Try this code »
// Defining function
function sayHello() {
alert("Hello, welcome to this website!");
}
// Calling function
sayHello(); // 0utputs: Hello, welcome to this website!
Once a function is defined it can be called (invoked) from anywhere in the document, by
typing its name followed by a set of parentheses, like sayHello() in the example above.
Note: A function name must start with a letter or underscore character not with a number,
optionally followed by the more letters, numbers, or underscore characters. Function names
are case sensitive, just like variable names.
Parameters are set on the first line of the function inside the set of parentheses, like this:
function functionName(parameter1, parameter2, parameter3) {
// Code to be executed
}
The displaySum() function in the following example takes two numbers as arguments, simply
add them together and then display the result in the browser.
Example
Try this code »
// Defining function
function displaySum(num1, num2) {
var total = num1 + num2;
alert(total);
}
// Calling function
displaySum(6, 20); // 0utputs: 26
displaySum(-5, 17); // 0utputs: 12
You can define as many parameters as you like. However for each parameter you specify, a
corresponding argument needs to be passed to the function when it is called, otherwise its
value becomes undefined. Let's consider the following example:
Example
Try this code »
// Defining function
function showFullname(firstName, lastName) {
alert(firstName + " " + lastName);
}
// Calling function
showFullname("Clark", "Kent"); // 0utputs: Clark Kent
showFullname("John"); // 0utputs: John undefined
Example
Try this code »
function sayHello(name = 'Guest') {
alert('Hello, ' + name);
}
The return statement usually placed as the last line of the function before the closing curly
bracket and ends it with a semicolon, as shown in the following example.
Example
Try this code »
// Defining function
function getSum(num1, num2) {
var total = num1 + num2;
return total;
}
Example
Try this code »
// Defining function
function divideNumbers(dividend, divisor){
var quotient = dividend / divisor;
var arr = [dividend, divisor, quotient];
return arr;
}
Example
Try this code »
// Function Declaration
function getSum(num1, num2) {
var total = num1 + num2;
return total;
}
// Function Expression
var getSum = function(num1, num2) {
var total = num1 + num2;
return total;
};
Once function expression has been stored in a variable, the variable can be used as a function:
Example
Try this code »
var getSum = function(num1, num2) {
var total = num1 + num2;
return total;
};
Tip: In JavaScript functions can be stored in variables, passed into other functions as
arguments, passed out of functions as return values, and constructed at run-time.
The syntax of the function declaration and function expression looks very similar, but they
differ in the way they are evaluated, check out the following example:
Example
Try this code »
declaration(); // Outputs: Hi, I'm a function declaration!
function declaration() {
alert("Hi, I'm a function declaration!");
}
JavaScript parse declaration function before the program executes. Therefore, it doesn't
matter if the program invokes the function before it is defined because JavaScript has hoisted
the function to the top of the current scope behind the scenes. The function expression is not
evaluated until it is assigned to a variable; therefore, it is still undefined when invoked.
ES6 has introduced even shorter syntax for writing function expression which is called arrow
function, please check out the JavaScript ES6 features chapter to learn more about it.
By default, variables declared within a function have local scope that means they cannot be
viewed or manipulated from outside of that function, as shown in the example below:
Example
Try this code »
// Defining function
function greetWorld() {
var greet = "Hello World!";
alert(greet);
}
// Defining function
function greetWorld() {
alert(greet);
}
Creating Objects
An object can be created with curly brackets {} with an optional list of properties. A property
is a "key: value" pair, where the key (or property name) is always a string, and value
(or property value) can be any data type, like strings, numbers, Booleans or complex data type
like arrays, functions, and other objects. Additionally, properties with functions as their values
are often called methods to distinguish them from other properties. A typical JavaScript object
may look like this:
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
The above example creates an object called person that has three properties name, age,
and gender and one method displayName(). The displayName() method displays the value
of this.name, which resolves to person.name. This is the easiest and preferred way to create a
new object in JavaScript, which is known as object literals syntax.
The property names generally do not need to be quoted unless they are reserved words, or if
they contain spaces or special characters (anything other than letters, numbers, and
the _ and $ characters), or if they start with a number, as shown in the following example:
Example
Try this code »
var person = {
"first name": "Peter",
"current age": 28,
gender: "Male"
};
Note: Since ECMAScript 5, reserved words can be used as object's property names without
quoting. However, you should avoid doing this for better compatibility.
Example
Try this code »
var book = {
"name": "Harry Potter and the Goblet of Fire",
"author": "J. K. Rowling",
"year": 2000
};
// Dot notation
document.write(book.author); // Prints: J. K. Rowling
// Bracket notation
document.write(book["year"]); // Prints: 2000
The dot notation is easier to read and write, but it cannot always be used. If the name of the
property is not valid (i.e. if it contains spaces or special characters), you cannot use the dot
notation; you'll have to use bracket notation, as shown in the following example:
Example
Try this code »
var book = {
name: "Harry Potter and the Goblet of Fire",
author: "J. K. Rowling",
"publication date": "8 July 2000"
};
// Bracket notation
document.write(book["publication date"]); // Prints: 8 July 2000
The square bracket notation offers much more flexibility than dot notation. It also allows you
to specify property names as variables instead of just string literals, as shown in the example
below:
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
person["email"] = "peterparker@mail.com";
document.write(person.email); // Prints: peterparker@mail.com
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
// Deleting property
delete person.age;
alert(person.age); // Outputs: undefined
Note: The delete operator only removes an object property or array element. It has no effect
on variables or declared functions. However, you should avoid delete operator for deleting an
array element, as it doesn't change the array's length, it just leaves a hole in the array.
Calling Object's Methods
You can access an object's method the same way as you would access properties—using the
dot notation or using the square bracket notation. Here's an example:
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
Example
Try this code »
var message = "Hello World!";
Example
Try this code »
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
To understand this more clearly, let's consider the following simple HTML document:
Example
Try this code »
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
</head>
<body>
<h1>Mobile OS</h1>
<ul>
<li>Android</li>
<li>iOS</li>
</ul>
</body>
</html>
The above HTML document can be represented by the following DOM tree:
The above diagram demonstrates the parent/child relationships between the nodes. The
topmost node i.e. the Document node is the root node of the DOM tree, which has one child,
the <html> element. Whereas, the <head> and <body> elements are the child nodes of
the <html> parent node. The <head> and <body> elements are also siblings since they are at the
same level. Further, the text content inside an element is a child node of the parent element.
So, for example, "Mobile OS" is considered as a child node of the <h1> that contains it, and so
on. Comments inside the HTML document are nodes in the DOM tree as well, even though it
doesn't affect the visual representation of the document in any way. Comments are useful for
documenting the code, however, you will rarely need to retrieve and manipulate them.
HTML attributes such as id, class, title, style, etc. are also considered as nodes in DOM
hierarchy but they don't participate in parent/child relationships like the other nodes do. They
are accessed as properties of the element node that contains them.
Each element in an HTML document such as image, hyperlink, form, button, heading,
paragraph, etc. is represented using a JavaScript object in the DOM hierarchy, and each object
contains properties and methods to describe and manipulate these objects. For example,
the style property of the DOM elements can be used to get or set the inline style of an element.
In the next few chapters we'll learn how to access individual elements on a web page and
manipulate them, for example, changing their style, content, etc. using the JavaScript
program.
Tip: The Document Object Model or DOM is, in fact, basically a representation of the various
components of the browser and the current Web document (HTML or XML) that can be
accessed or manipulated using a scripting language such as JavaScript.
In the following sections, you will see some of the common ways of selecting the elements on
a page and do something with them using the JavaScript.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Select Topmost Elements</title>
</head>
<body>
<script>
// Display lang attribute value of html element
alert(document.documentElement.getAttribute("lang")); // Outputs: en
// Set background color of body element
document.body.style.background = "yellow";
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Document.body Demo</title>
<script>
alert("From HEAD: " + document.body); // Outputs: null (since <body>
is not parsed yet)
</script>
</head>
<body>
<script>
alert("From BODY: " + document.body); // Outputs: HTMLBodyElement
</script>
</body>
</html>
Selecting Elements by ID
You can select an element based on its unique ID with the getElementById() method. This is
the easiest way to find an HTML element in the DOM tree.
The following example selects and highlight an element having the ID attribute id="mark".
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Select Element by ID</title>
</head>
<body>
<p id="mark">This is a paragraph of text.</p>
<p>This is another paragraph of text.</p>
<script>
// Selecting element with id mark
var match = document.getElementById("mark");
Note: Any HTML element can have an id attribute. The value of this attribute must be unique
within a page i.e. no two elements in the same page can have the same ID.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Select Elements by Class Name</title>
</head>
<body>
<p class="test">This is a paragraph of text.</p>
<div class="block test">This is another paragraph of text.</div>
<p>This is one more paragraph of text.</p>
<script>
// Selecting elements with class test
var matches = document.getElementsByClassName("test");
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Select Elements by Tag Name</title>
</head>
<body>
<p>This is a paragraph of text.</p>
<div class="test">This is another paragraph of text.</div>
<p>This is one more paragraph of text.</p>
<script>
// Selecting all paragraph elements
var matches = document.getElementsByTagName("p");
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Select Elements with CSS Selectors</title>
</head>
<body>
<ul>
<li>Bread</li>
<li class="tick">Coffee</li>
<li>Pineapple Cake</li>
</ul>
<script>
// Selecting all li elements
var matches = document.querySelectorAll("ul li");
The following example will set the color and font properties of an element with id="intro".
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Set Inline Styles Demo</title>
</head>
<body>
<p id="intro">This is a paragraph.</p>
<p>This is another paragraph.</p>
<script>
// Selecting element
var elem = document.getElementById("intro");
Therefore, in JavaScript, the CSS property names that contain one or more hyphens are
converted to intercapitalized style word. It is done by removing the hyphens and capitalizing
the letter immediately following each hyphen, thus the CSS property font-size becomes the
DOM property fontSize, border-left-style becomes borderLeftStyle, and so on.
Getting Style Information from Elements
Similarly, you get the styles applied on the HTML elements using the style property.
The following example will get the style information from the element having id="intro".
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Get Element's Style Demo</title>
</head>
<body>
<p id="intro" style="color:red; font-size:20px;">This is a
paragraph.</p>
<p>This is another paragraph.</p>
<script>
// Selecting element
var elem = document.getElementById("intro");
To get the values of all CSS properties that are actually used to render an element you can use
the window.getComputedStyle() method, as shown in the following example:
Example
Try this code »
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Get Computed Style Demo</title>
<style type="text/css">
#intro {
font-weight: bold;
font-style: italic;
}
</style>
</head>
<body>
<p id="intro" style="color:red; font-size:20px;">This is a
paragraph.</p>
<p>This is another paragraph.</p>
<script>
// Selecting element
var elem = document.getElementById("intro");
Since, class is a reserved word in JavaScript, so JavaScript uses the className property to refer
the value of the HTML class attribute. The following example will show to how to add a new
class, or replace all existing classes to a <div> element having id="info".
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS Add or Replace CSS Classes Demo</title>
<style>
.highlight {
background: yellow;
}
</style>
</head>
<body>
<div id="info" class="disabled">Something very important!</div>
<script>
// Selecting element
var elem = document.getElementById("info");
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JS classList Demo</title>
<style>
.highlight {
background: yellow;
}
</style>
</head>
<body>
<div id="info" class="disabled">Something very important!</div>
<script>
// Selecting element
var elem = document.getElementById("info");
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
// Creating a new div element
var newDiv = document.createElement("div");
// Adding the newly created element and its content into the DOM
var currentDiv = document.getElementById("main");
document.body.appendChild(newDiv, currentDiv);
</script>
The appendChild() method adds the new element at the end of any other children of a specified
parent node. However, if you want to add the new element at the beginning of any other
children you can use the insertBefore() method, as shown in example below:
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
// Creating a new div element
var newDiv = document.createElement("div");
// Adding the newly created element and its content into the DOM
var currentDiv = document.getElementById("main");
document.body.insertBefore(newDiv, currentDiv);
</script>
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
// Getting inner HTML conents
var contents = document.getElementById("main").innerHTML;
alert(contents); // Outputs inner html contents
This method accepts two parameters: the position in which to insert and the HTML text to
insert. The position must be one of the following values: "beforebegin", "afterbegin", "beforeend",
and "afterend". This method is supported in all major browsers.
The following example shows the visualization of position names and how it works.
Example
Try this code »
<!-- beforebegin -->
<div id="main">
<!-- afterbegin -->
<h1 id="title">Hello World!</h1>
<!-- beforeend -->
</div>
<!-- afterend -->
<script>
// Selecting target element
var mainDiv = document.getElementById("main");
// Inserting HTML just inside the element, before its first child
mainDiv.insertAdjacentHTML('afterbegin', '<p>This is paragraph two.</p>');
// Inserting HTML just inside the element, after its last child
mainDiv.insertAdjacentHTML('beforeend', '<p>This is paragraph
three.</p>');
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
var parentElem = document.getElementById("main");
var childElem = document.getElementById("hint");
parentElem.removeChild(childElem);
</script>
It is also possible to remove the child element without exactly knowing the parent element.
Simply find the child element and use the parentNode property to find its parent element. This
property returns the parent of the specified node in the DOM tree. Here's an example:
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
var childElem = document.getElementById("hint");
childElem.parentNode.removeChild(childElem);
</script>
Example
Try this code »
<div id="main">
<h1 id="title">Hello World!</h1>
<p id="hint">This is a simple paragraph.</p>
</div>
<script>
var parentElem = document.getElementById("main");
var oldPara = document.getElementById("hint");
DOM node provides several properties and methods that allow you to navigate or traverse
through the tree structure of the DOM and make changes very easily. In the following section
we will learn how to navigate up, down, and sideways in the DOM tree using JavaScript.
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var main = document.getElementById("main");
console.log(main.firstChild.nodeName); // Prints: #text
If you notice the above example, the nodeName of the first-child node of the main DIV element
returns #text instead of H1. Because, whitespace such as spaces, tabs, newlines, etc. are valid
characters and they form #text nodes and become a part of the DOM tree. Therefore, since
the <div> tag contains a newline before the <h1> tag, so it will create a #text node.
To avoid the issue with firstChild and lastChild returning #text or #comment nodes, you
could alternatively use the firstElementChild and lastElementChild properties to return
only the first and last element node, respectively. But, it will not work in IE 9 and earlier.
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var main = document.getElementById("main");
alert(main.firstElementChild.nodeName); // Outputs: H1
main.firstElementChild.style.color = "red";
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var main = document.getElementById("main");
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var main = document.getElementById("main");
The parentNode will always return null for document node, since it doesn't have a parent.
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var hint = document.getElementById("hint");
alert(hint.parentNode.nodeName); // Outputs: DIV
alert(document.documentElement.parentNode.nodeName); // Outputs: #document
alert(document.parentNode); // Outputs: null
</script>
Tip: The topmost DOM tree nodes can be accessed directly as document properties. For
example, the <html> element can be accessed with document.documentElement property,
whereas the <head> element can be accessed with document.head property, and
the <body> element can be accessed with document.body property.
However, if you want to get only element nodes you can use the parentElement, like this:
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var hint = document.getElementById("hint");
alert(hint.parentNode.nodeName); // Outputs: DIV
hint.parentNode.style.backgroundColor = "yellow";
</script>
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p><hr>
</div>
<script>
var title = document.getElementById("title");
alert(title.previousSibling.nodeName); // Outputs: #text
Example
Try this code »
<div id="main">
<h1 id="title">My Heading</h1>
<p id="hint"><span>This is some text.</span></p>
</div>
<script>
var hint = document.getElementById("hint");
alert(hint.previousElementSibling.nodeName); // Outputs: H1
alert(hint.previousElementSibling.textContent); // Outputs: My Heading
Every node has a nodeType property that you can use to find out what type of node you are
dealing with. The following table lists the most important node types:
DOCUMENT_TYPE_NODE 10 A document type node e.g. <!DOCTYPE html> for HTML5 documents.
If you remember from the preceding chapters we've used the alert() method in our scripts to
show popup messages. This is a method of the window object.
In the next few chapters we will see a number of new methods and properties of
the window object that enables us to do things such as prompt user for information, confirm
user's action, open new windows, etc. which lets you to add more interactivity to your web
pages.
Example
Try this code »
<script>
function windowSize(){
var w = window.innerWidth;
var h = window.innerHeight;
alert("Width: " + w + ", " + "Height: " + h);
}
</script>
Example
Try this code »
<script>
function windowSize(){
var w = document.documentElement.clientWidth;
var h = document.documentElement.clientHeight;
alert("Width: " + w + ", " + "Height: " + h);
}
</script>
Example
Try this code »
<script>
function getResolution() {
alert("Your screen is: " + screen.width + "x" + screen.height);
}
</script>
The screen's available width and height is equal to screen's actual width and height minus
width and height of interface features like the taskbar in Windows. Here's an example:
Example
Try this code »
<script>
function getAvailSize() {
alert("Available Screen Width: " + screen.availWidth + ", Height: " +
screen.availHeight);
}
</script>
Example
Try this code »
<script>
function getColorDepth() {
alert("Your screen color depth is: " + screen.colorDepth);
}
</script>
For modern devices, color depth and pixel depth are equal. Here's an example:
Example
Try this code »
<script>
function getPixelDepth() {
alert("Your screen pixel depth is: " + screen.pixelDepth);
}
</script>
The following example will display the complete URL of the page on button click:
Example
Try this code »
<script>
function getURL() {
alert("The URL of this page is: " + window.location.href);
}
</script>
Try out the following example to see how to use the location property of a window.
Example
Try this code »
// Prints complete URL
document.write(window.location.href);
Example
Try this code »
<script>
function loadHomePage() {
window.location.assign("https://www.tutorialrepublic.com");
}
</script>
Example
Try this code »
<script>
function loadHomePage(){
window.location.replace("https://www.tutorialrepublic.com");
}
</script>
Example
Try this code »
<script>
function loadHomePage() {
window.location.href = "https://www.tutorialrepublic.com";
}
</script>
You can optionally specify a Boolean parameter true or false. If the parameter is true, the
method will force the browser to reload the page from the server. If it is false or not specified,
the browser may reload the page from its cache. Here's an example:
Example
Try this code »
<script>
function forceReload() {
window.location.reload(true);
}
</script>
Example
Try this code »
var d = new Date();
document.write(d);
The year and month parameters are required other parameters are optional.
Example
Try this code »
var d = new Date(2018,0,31,14,35,20,50);
document.write(d);
This date is actually represent 31 January 2018 at 14:35:20 and 50 milliseconds. You can
ignore the time part and specify just the date part if you wish.
Example
Try this code »
var d = new Date("31 January 2018");
document.write(d);
This date represents 31 January 2018. You can also specify strings like Jan 31 2018, or any of a
number of valid variations, JavaScript will automatically handle that.
The new Date(milliseconds) Syntax
You can also define a Date object by passing the number of milliseconds since January 1,
1970, at 00:00:00 GMT. This time is known as the UNIX epoch because 1970 was the year when
the UNIX operating system was formally introduced. Here's an example:
Example
Try this code »
var d = new Date(1517356800000);
document.write(d);
The above date represents Wednesday 31 January 2018 05:30:00 GMT+0530.
Once you have created an instance of the Date object, you can use its methods to perform
various tasks, such as getting different component of a date, setting or modifying individual
date and time value, etc. These methods are described in detail in the following sections.
Note: JavaScript provides shortcuts called "literals" for creating most of the native object
without having to use the new operator, like new Object(), new Array(), etc.
Example
Try this code »
var now = new Date();
alert(now); // Display the current date and time
The output of this example will look something like this (depending on time zone offset):
Example
Try this code »
var d = new Date();
alert(d.toDateString()); // Display an abbreviated date string
alert(d.toLocaleDateString()); // Display a localized date string
alert(d.toISOString()); // Display the ISO standardized date string
alert(d.toUTCString()); // Display a date string converted to UTC time
alert(d.toString()); // Display the full date string with local time zone
Similarly, you can use the toLocaleTimeString(), toTimeString() methods of the Date
object to generate time strings, as shown in the following example:
Example
Try this code »
var d = new Date();
alert(d.toTimeString()); // Display the time portion of the date
alert(d.toLocaleTimeString()); // Display a localized time string
Example
Try this code »
var d = new Date();
// Extracting date part
alert(d.getDate()); // Display the day of the month
alert(d.getDay()); // Display the number of days into the week (0-6)
alert(d.getMonth()); // Display the number of months into the year (0-11)
alert(d.getFullYear()); // Display the full year (four digits)
The getDay() method returns a number representing the day of the week (from 0 to 6)
instead of returning a name such as Sunday or Monday in such a way that, if it is Sunday, the
method returns 0; and if it is Monday , the method returns 1, and so on.
Likewise, the getMonth() method returns the number of months (from 0 to 11) instead of
name of the month. Here 0 represents the first month of the year. Therefore, if it is January
the method returns 0 not 1; and if it is August, the method returns 7.
Getting the Hours, Minutes, Seconds, and Milliseconds
Similarly, the Date object provides methods
like getHours(), getMinutes(), getSeconds(), getTimezoneOffset() etc. to extract the time
components from the Date object.
Example
Try this code »
var d = new Date();
// Extracting time part
alert(d.getHours()); // Display the number of hours into the day (0-23)
alert(d.getMinutes()); // Display the number of minutes into the hour (0-
59)
alert(d.getSeconds()); // Display the seconds into the minute (0-59)
alert(d.getMilliseconds()); // Display the number of milliseconds into
second (0-999)
alert(d.getTime()); // Display the number of milliseconds since 1/1/1970
alert(d.getTimezoneOffset()); // Display the time-zone offset (from
Greenwich Mean Time) in minutes
The getHours() method returns the number of hours into the day (from 0 to 23) according to
the 24-hour clock. So, when it is midnight, the method returns 0; and when it is 3:00 P.M., it
returns 15.
Note: The Date objects also have methods to obtain the UTC components. Just place UTC
after get, such as getUTCDate(), getUTCHour(), getUTCMinutes(), and so on.
For instance, in the following example we have used setFullYear() method to change the
current date stored in a variable ahead of two year in the future.
Example
Try this code »
var d = new Date();
d.setFullYear(d.getFullYear() + 2);
alert(d); // Display future date
The output of the above example will look something like this:
Likewise, you can use the setMonth() method to set or modify the month part of a Date
object.
Example
Try this code »
var d = new Date(); // Current date and time
d.setMonth(0); // Sets month to 0, January
document.write(d);
The setMonth() method require an integer value from 0 to 11, if you set the value of the
month greater than 11, the year value of the date object will increment.
In other words, a value of 12 results in the year value increasing by 1, and the month value set
to 0, as demonstrated in the following example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setMonth(12); // Sets month to 12, new date will be January 24, 2019
document.write(d);
Similarly, you can modify the date part of the date object, like this:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setDate(15); // Sets date to 15, new date will be June 15, 2018
document.write(d);
The setDate() method require an integer value from 1 to 31. Also, if you pass the values
greater than the number of days in the month, the month will increment. For example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setDate(36); // Sets day to 36, new date will be July 6, 2018
document.write(d);
Setting the Hours, Minutes and Seconds
Methods for setting the time values are also pretty straight forward.
The setHours(), setMinutes(), setSeconds(), setMilliseconds() can be used to set the
hour, minutes, seconds, and milliseconds part of the Date object respectively.
Each method takes integer values as parameters. Hours range from 0 to 23. Minutes and
seconds range from 0 to 59. And milliseconds range from 0 to 999. Here is an example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018 00:00:00
d.setHours(8);
d.setMinutes(30);
d.setSeconds(45);
d.setMilliseconds(600);
document.write(d);
The output of the above example will look something like the following:
Example
Try this code »
var d = new Date();
document.write(d);
The year and month parameters are required other parameters are optional.
Example
Try this code »
var d = new Date(2018,0,31,14,35,20,50);
document.write(d);
This date is actually represent 31 January 2018 at 14:35:20 and 50 milliseconds. You can
ignore the time part and specify just the date part if you wish.
Example
Try this code »
var d = new Date("31 January 2018");
document.write(d);
This date represents 31 January 2018. You can also specify strings like Jan 31 2018, or any of a
number of valid variations, JavaScript will automatically handle that.
The new Date(milliseconds) Syntax
You can also define a Date object by passing the number of milliseconds since January 1,
1970, at 00:00:00 GMT. This time is known as the UNIX epoch because 1970 was the year when
the UNIX operating system was formally introduced. Here's an example:
Example
Try this code »
var d = new Date(1517356800000);
document.write(d);
The above date represents Wednesday 31 January 2018 05:30:00 GMT+0530.
Once you have created an instance of the Date object, you can use its methods to perform
various tasks, such as getting different component of a date, setting or modifying individual
date and time value, etc. These methods are described in detail in the following sections.
Note: JavaScript provides shortcuts called "literals" for creating most of the native object
without having to use the new operator, like new Object(), new Array(), etc.
Example
Try this code »
var now = new Date();
alert(now); // Display the current date and time
The output of this example will look something like this (depending on time zone offset):
Example
Try this code »
var d = new Date();
alert(d.toDateString()); // Display an abbreviated date string
alert(d.toLocaleDateString()); // Display a localized date string
alert(d.toISOString()); // Display the ISO standardized date string
alert(d.toUTCString()); // Display a date string converted to UTC time
alert(d.toString()); // Display the full date string with local time zone
Similarly, you can use the toLocaleTimeString(), toTimeString() methods of the Date
object to generate time strings, as shown in the following example:
Example
Try this code »
var d = new Date();
alert(d.toTimeString()); // Display the time portion of the date
alert(d.toLocaleTimeString()); // Display a localized time string
Example
Try this code »
var d = new Date();
// Extracting date part
alert(d.getDate()); // Display the day of the month
alert(d.getDay()); // Display the number of days into the week (0-6)
alert(d.getMonth()); // Display the number of months into the year (0-11)
alert(d.getFullYear()); // Display the full year (four digits)
The getDay() method returns a number representing the day of the week (from 0 to 6)
instead of returning a name such as Sunday or Monday in such a way that, if it is Sunday, the
method returns 0; and if it is Monday , the method returns 1, and so on.
Likewise, the getMonth() method returns the number of months (from 0 to 11) instead of
name of the month. Here 0 represents the first month of the year. Therefore, if it is January
the method returns 0 not 1; and if it is August, the method returns 7.
Getting the Hours, Minutes, Seconds, and Milliseconds
Similarly, the Date object provides methods
like getHours(), getMinutes(), getSeconds(), getTimezoneOffset() etc. to extract the time
components from the Date object.
Example
Try this code »
var d = new Date();
// Extracting time part
alert(d.getHours()); // Display the number of hours into the day (0-23)
alert(d.getMinutes()); // Display the number of minutes into the hour (0-
59)
alert(d.getSeconds()); // Display the seconds into the minute (0-59)
alert(d.getMilliseconds()); // Display the number of milliseconds into
second (0-999)
alert(d.getTime()); // Display the number of milliseconds since 1/1/1970
alert(d.getTimezoneOffset()); // Display the time-zone offset (from
Greenwich Mean Time) in minutes
The getHours() method returns the number of hours into the day (from 0 to 23) according to
the 24-hour clock. So, when it is midnight, the method returns 0; and when it is 3:00 P.M., it
returns 15.
Note: The Date objects also have methods to obtain the UTC components. Just place UTC
after get, such as getUTCDate(), getUTCHour(), getUTCMinutes(), and so on.
For instance, in the following example we have used setFullYear() method to change the
current date stored in a variable ahead of two year in the future.
Example
Try this code »
var d = new Date();
d.setFullYear(d.getFullYear() + 2);
alert(d); // Display future date
The output of the above example will look something like this:
Likewise, you can use the setMonth() method to set or modify the month part of a Date
object.
Example
Try this code »
var d = new Date(); // Current date and time
d.setMonth(0); // Sets month to 0, January
document.write(d);
The setMonth() method require an integer value from 0 to 11, if you set the value of the
month greater than 11, the year value of the date object will increment.
In other words, a value of 12 results in the year value increasing by 1, and the month value set
to 0, as demonstrated in the following example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setMonth(12); // Sets month to 12, new date will be January 24, 2019
document.write(d);
Similarly, you can modify the date part of the date object, like this:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setDate(15); // Sets date to 15, new date will be June 15, 2018
document.write(d);
The setDate() method require an integer value from 1 to 31. Also, if you pass the values
greater than the number of days in the month, the month will increment. For example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018
d.setDate(36); // Sets day to 36, new date will be July 6, 2018
document.write(d);
Setting the Hours, Minutes and Seconds
Methods for setting the time values are also pretty straight forward.
The setHours(), setMinutes(), setSeconds(), setMilliseconds() can be used to set the
hour, minutes, seconds, and milliseconds part of the Date object respectively.
Each method takes integer values as parameters. Hours range from 0 to 23. Minutes and
seconds range from 0 to 59. And milliseconds range from 0 to 999. Here is an example:
Example
Try this code »
var d = new Date(2018, 5, 24); // June 24, 2018 00:00:00
d.setHours(8);
d.setMinutes(30);
d.setSeconds(45);
d.setMilliseconds(600);
document.write(d);
The output of the above example will look something like the following:
Here is an example that calculates the area of a circle using the Math.PI property.
Example
Try this code »
// Printing PI value
document.write(Math.PI); // Prints: 3.141592653589793
Example
Try this code »
document.write(Math.abs(-1)); // Prints: 1
document.write(Math.abs(1)); // Prints: 1
document.write(Math.abs(-5)); // Prints: 5
document.write(Math.abs(-10.5)); // Prints: 10.5
Example
Try this code »
document.write(Math.random()); // Expected output: a number between 0 and
1
Rounding Numbers
The JavaScript Math object provides few methods to round numbers, each one has its own
purpose. The following section will describe these methods in detials.
Example
Try this code »
document.write(Math.ceil(3.5)); // Prints: 4
document.write(Math.ceil(-5.7)); // Prints: -5
document.write(Math.ceil(9.99)); // Prints: 10
document.write(Math.ceil(-9.99)); // Prints: -9
document.write(Math.ceil(0)); // Prints: 0
Example
Try this code »
document.write(Math.floor(3.5)); // Prints: 3
document.write(Math.floor(-5.7)); // Prints: -6
document.write(Math.floor(9.99)); // Prints: 9
document.write(Math.floor(-9.99)); // Prints: -10
document.write(Math.floor(0)); // Prints: 0
Example
Try this code »
document.write(Math.round(3.5)); // Prints: 4
document.write(Math.round(-5.7)); // Prints: -6
document.write(Math.round(7.25)); // Prints: 7
document.write(Math.round(4.49)); // Prints: 4
document.write(Math.round(0)); // Prints: 0
Example
Try this code »
document.write(Math.max(1, 3, 2)); // Prints: 3
document.write(Math.max(-1, -3, -2)); // Prints: -1
Example
Try this code »
var numbers = [1, 3, 2];
Example
Try this code »
var numbers = [1, 3, 2];
document.write(Math.max(...numbers)); // Prints: 3
document.write(Math.min(...numbers)); // Prints: 1
Example
Try this code »
document.write(Math.pow(3, 2)); // Prints: 9
document.write(Math.pow(0, 1)); // Prints: 0
document.write(Math.pow(5, -2)); // Prints: 0.04
document.write(Math.pow(16, 0.5)); // Prints: 4 (square root of 4)
document.write(Math.pow(8, 1/3)); // Prints: 2 (cube root of 8)
A positive exponent indicates multiplication (52 = 5 x 5 = 25), a negative exponent indicates
division (5-2 = 1/52 = 0.04), whereas a fractional exponent indicates a root of the base.
Since, pi radians are equal to 180 degrees: π rad = 180°. Therefore, π/2 radians is equal 90
degrees, π/3 radians is equal to 60 degrees, and so on. Here's an example:
Example
Try this code »
document.write(Math.sin(0 * Math.PI / 180)); // Prints: 0
document.write(Math.sin(90 * Math.PI / 180)); // Prints: 1
document.write(Math.cos(0 * Math.PI / 180)); // Prints: 1
document.write(Math.cos(180 * Math.PI / 180)); // Prints: -1
document.write(Math.tan(0 * Math.PI / 180)); // Prints: 0
Example
Try this code »
alert("3" - 2); // Outputs: 1
alert("3" + 2); // Outputs: "32" (because + is also concatenation
operator)
alert(3 + "2"); // Outputs: "32"
alert("3" * "2"); // Outputs: 6
alert("10" / "2"); // Outputs: 5
alert(1 + true); // Outputs: 2 (because true is converted to 1)
alert(1 + false); // Outputs: 1 (because false is converted to 0)
alert(1 + undefined); // Outputs: NaN
alert(3 + null); // Outputs: 3 (because null is converted to 0)
alert("3" + null); // Outputs: "3null"
alert(true + null); // Outputs: 1
alert(true + undefined); // Outputs: NaN
There are situations when we need to manually convert a value from one data type to
another. JavaScript provides a number of different methods to perform such data type
conversion task. In the following sections we will discuss those methods in detail.
In such situations, you can use the global method Number() to convert strings to numbers.
Example
Try this code »
var str = "123";
alert(typeof str); // Outputs: string
Example
Try this code »
Number("10.5") // returns 10.5
Number(true) // returns 1
Number(false) // returns 0
Number(null) // returns 0
Number(" 123 ") // returns 123
Number(" ") // returns 0
Number("") // returns 0
Number("123e-1") // returns 12.3
Number("0xFF") // returns 255 (hexadecimal representation)
Number("undefined") // returns NaN
Number("null") // returns NaN
Number("Hello World!") // returns NaN
The following example will show you how to convert a Boolean value to a string.
Example
Try this code »
var bool = true;
alert(typeof bool); // Outputs: boolean
Example
Try this code »
String(10.5) // returns "10.5"
String(123) // returns "123"
String(100 + 23) // returns "123"
String(true) // returns "true"
String(false) // returns "false"
String(123e-1) // returns "12.3"
String(0xFF) // returns "255"
String(undefined) // returns "undefined"
String(null) // returns "null"
Another technique for converting numbers to strings is using the toString() method:
Example
Try this code »
var num = 123;
alert(typeof num); // Outputs: number
var str = num.toString(); // Becomes a string "123"
alert(typeof str); // Outputs: string
Values that are intuitively empty, like 0, null, false, undefined, NaN or an empty string ("")
become false. Other values become true, as shown in the example here:
Example
Try this code »
Boolean(0) // returns false
Boolean(null) // returns false
Boolean(false) // returns false
Boolean(undefined) // returns false
Boolean(NaN) // returns false
Boolean("") // returns false
Boolean("0") // returns true
Boolean(1) // returns true
Boolean(true) // returns true
Boolean("false") // returns true
Boolean("Hello World!") // returns true
Boolean(" ") // returns true
If you see the example carefully you'll find the Boolean() method returns true for the string with
zero "0", and string "false", whereas it returns false for the values 0 and false.
Note: In some programming languages (namely PHP) the string "0" is treated as false. But in
JavaScript a non-empty string is always true.
Example
Try this code »
var date1 = new Date(2018, 5, 24);
alert(date1); // Display date string like: Sun Jun 24 2018 00:00:00
Example
Try this code »
var arr = [1, 2, 3];
arr.toString(); // returns "1,2,3"
Example
Try this code »
var x = "10"; // x is a string
var y = +x;
alert(typeof(y)); // Outputs: number
alert(y); // Outputs: 10
var x = "123";
alert(typeof(!!x)); // Outputs: boolean
alert(!!x); // Outputs: true
var x = "Hello World!";
var y = +x;
alert(typeof(y));// Outputs: number
alert(y); // Outputs: NaN
To understand how event listeners actually works let's check out a simple example. Suppose
that you've created two functions and you try to execute both of them on click of the button
using the onclick event handler, as shown in the following example:
Example
Try this code »
<button id="myBtn">Click Me</button>
<script>
// Defining custom functions
function firstFunction() {
alert("The first function executed successfully!");
}
function secondFunction() {
alert("The second function executed successfully");
}
This is the main shortcoming of this classic event model—you can only assign one event
handler to a particular event on a particular element i.e. a single function per event per
element. To deal with this problem W3C introduced more flexible event-model called event
listeners.
Any HTML element can have multiple event listeners, therefore you can assign multiple
functions to the same event for the same element, as demonstrated in following example:
Example
Try this code »
<button id="myBtn">Click Me</button>
<script>
// Defining custom functions
function firstFunction() {
alert("The first function executed successfully!");
}
function secondFunction() {
alert("The second function executed successfully");
}
In addition to the event type and listener function parameter the addEventListener() accepts
one more Boolean parameter useCapture. This is an optional parameter which specifies
whether to use event bubbling or event capturing. Its basic syntax is:
target.addEventListener(event, function, useCapture);
Event bubbling and capturing are two ways of propagating events. We will learn about event
propagation in detail in the upcoming chapter.
Example
Try this code »
<button id="myBtn">Click Me</button>
<script>
// Selecting button element
var btn = document.getElementById("myBtn");
function setHoverColor() {
btn.style.background = "yellow";
}
function setNormalColor() {
btn.style.background = "";
}
Example
Try this code »
<div id="result"></div>
<script>
// Defining event listener function
function displayWindowSize() {
var w = window.innerWidth;
var h = window.innerHeight;
var size = "Width: " + w + ", " + "Height: " + h;
document.getElementById("result").innerHTML = size;
}
Example
Try this code »
<button id="myBtn">Click Me</button>
<script>
// Defining function
function greetWorld() {
alert("Hello World!");
}
Let's understand this with the help of an example, suppose you have assigned a click event
handler on a hyperlink (i.e. <a> element) which is nested inside a paragraph (i.e. <p> element).
Now if you click on that link, the handler will be executed. But, instead of link, if you assign the
click event handler to the paragraph containing the link, then even in this case, clicking the
link will still trigger the handler. That's because events don't just affect the target element that
generated the event—they travel up and down through the DOM tree to reach their target.
This is known as event propagation
The concept of event propagation was introduced to deal with the situations in which multiple
elements in the DOM hierarchy with a parent-child relationship have event handlers for the
same event, such as a mouse click. Now, the question is which element's click event will be
handled first when the user clicks on the inner element—the click event of the outer element,
or the inner element. In the following sections of this chapter we will discuss each phases of
the event propagation in greater detail and find out the answer of this question.
Note: Formally there are 3 phases, capture, target and bubble phase. But, the 2nd phase i.e.
the target phase (occurs when the event arrives at the target element that has generated the
event) is not handled separately in modern browsers, handlers registered for
both capturing and bubbling phases are executed in this phase.
Also if any ancestor (i.e. parent, grandparent, etc.) of the target element and the target itself
has a specially registered capturing event listener for that type of event, those listeners are
executed during this phase. Let's check out the following example:
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Event Capturing Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div id="wrap">DIV
<p class="hint">P
<a href="#">A</a>
</p>
</div>
<script>
function showTagName() {
alert("Capturing: "+ this.tagName);
}
<div id="wrap">
Event capturing is not supported in all browsers and rarely used. For instance, Internet
Explorer prior to version 9.0 does not support event capturing.
Also, event capturing only works with event handlers registered with
the addEventListener() method when the third argument is set to true. The traditional
method of assigning event handlers, like using onclick, onmouseover, etc. won't work here.
Please check out the JavaScript event listeners chapter to learn more about event listeners.
The Bubbling Phase
In the bubbling phase, the exact opposite occurs. In this phase event propagates or bubbles
back up the DOM tree, from the target element up to the Window, visiting all of the ancestors
of the target element one by one. For example, if the user clicks a hyperlink, that click event
would pass through the <p> element containing the link, the <body> element,
the <html> element, and the document node.
Also, if any ancestor of the target element and the target itself has event handlers assigned
for that type of event, those handlers are executed during this phase. In modern browsers, all
event handlers are registered in the bubbling phase, by default. Let's check out an example:
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Event Bubbling Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div onclick="alert('Bubbling: ' + this.tagName)">DIV
<p onclick="alert('Bubbling: ' + this.tagName)">P
<a href="#" onclick="alert('Bubbling: ' + this.tagName)">A</a>
</p>
</div>
</body>
</html>
Here is a simple demonstration that we've created utilizing the above example to show you
how event bubbling works. Click on any element and observe in which order alert pop-ups
appears.
<div id="wrap">
Event bubbling is supported in all browsers, and it works for all handlers, regardless of how
they are registered e.g. using onclick or addEventListener() (unless they are registered
as capturing event listener). That's why the term event propagation is often used as a
synonym of event bubbling.
The target element is accessible as event.target, it doesn't change through the event
propagation phases. Additionally, the this keyword represents the current element (i.e. the
element that has a currently running handler attached to it). Let's check out an example:
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Event Target Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div id="wrap">DIV
<p class="hint">P
<a href="#">A</a>
</p>
</div>
<script>
// Selecting the div element
var div = document.getElementById("wrap");
<div id="wrap">
The fat arrow (=>) sign we've used in the example above is an arrow function expression. It has
a shorter syntax than a function expression, and it would make the this keyword behave
properly. Please check out the tutorial on ES6 features to learn more about arrow function.
For example, suppose you have nested elements and each element has onclick event handler
that displays an alert dialog box. Normally, when you click on the inner element all handlers
will be executed at once, since event bubble up to the DOM tree.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Event Propagation Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div id="wrap">DIV
<p class="hint">P
<a href="#">A</a>
</p>
</div>
<script>
function showAlert() {
alert("You clicked: "+ this.tagName);
}
<div id="wrap">
To prevent this situation you can stop event from bubbling up the DOM tree using
the event.stopPropagation() method. In the following example click event listener on the
parent elements will not execute if you click on the child elements.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Stop Event Propagation Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div id="wrap">DIV
<p class="hint">P
<a href="#">A</a>
</p>
</div>
<script>
function showAlert(event) {
alert("You clicked: "+ this.tagName);
event.stopPropagation();
}
Additionally, you can even prevent any other listeners attached to the same element for the
same event type from being executed using the stopImmediatePropagation() method.
In the following example we've attached multiple listeners to the hyperlink, but only one
listener for the hyperlink will execute when you click the link, and you will see only one alert.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Stop Immediate Propagation Demo</title>
<style type="text/css">
div, p, a{
padding: 15px 30px;
display: block;
border: 2px solid #000;
background: #fff;
}
</style>
</head>
<body>
<div onclick="alert('You clicked: ' + this.tagName)">DIV
<p onclick="alert('You clicked: ' + this.tagName)">P
<a href="#" id="link">A</a>
</p>
</div>
<script>
function sayHi() {
alert("Hi, there!");
event.stopImmediatePropagation();
}
function sayHello() {
alert("Hello World!");
}
However, preventing the default actions does not stop event propagation; the event
continues to propagate to the DOM tree as usual. Here's is an example:
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Prevent Default Demo</title>
</head>
<body>
<form action="/examples/html/action.php" method="post" id="users">
<label>First Name:</label>
<input type="text" name="first-name" id="firstName">
<input type="submit" value="Submit" id="submitBtn">
</form>
<script>
var btn = document.getElementById("submitBtn");
btn.addEventListener("click", function(event) {
var name = document.getElementById("firstName").value;
alert("Sorry, " + name + ". The preventDefault() won't let you
submit this form!");
event.preventDefault(); // Prevent form submission
});
</script>
</body>
</html>
JavaScript provides two methods for all function objects, call() and apply(), that allow a
function to be invoked as if it were a method of another object. Here's an example:
Example
Try this code »
var objA = {
name: "object A",
say: function(greet) {
alert(greet + ", " + this.name);
}
}
var objB = {
name: "object B"
}
/* The objB doesn't have say() method, but it can borrow it from objA */
objA.say.call(objB, "Hello"); // Displays: Hello, object B
Notice the square brackets ([]), which denotes an array, in the last line of the following
example:
Example
Try this code »
var objA = {
name: "object A",
say: function(greet) {
alert(greet + ", " + this.name);
}
}
var objB = {
name: "object B"
}
/* The objB doesn't have say() method, but it can borrow it from objA */
objA.say.apply(objB, ["Hello"]); // Displays: Hello, object B
As you already know from the previous chapters JavaScript arrays do not have a max() method,
but Math has, so we can apply the Math.max() method, like this:
Example
Try this code »
var numbers = [2, 5, 6, 4, 3, 7];
The new ES6 spread operator provides a shorter way to obtain the maximum or minimum value
from an array without using the apply() method. Here's an example:
Example
Try this code »
var numbers = [2, 5, 6, 4, 3, 7];
// Using spread operator
var max = Math.max(...numbers);
alert(max); // Outputs: 7
However, both spread (...) and apply() will either fail or return the incorrect result if the array
has too many elements (e.g. tens of thousands). In that case you can use the Array.reduce() to
find the maximum or minimum value in a numeric array, by comparing each value, like this:
Example
Try this code »
var numbers = [2, 5, 6, 4, 3, 7];
What is Hoisting
In JavaScript, all variable and function declarations are moved or hoisted to the top of their
current scope, regardless of where it is defined. This is the default behavior of JavaScript
interpreter which is called hoisting. In the following sections we'll take a closer look at how it
actually works.
Function Hoisting
Functions that are defined using a function declaration are automatically hoisted. That means
they can be called before they have been defined. Let's understand this with an example:
Example
Try this code »
// Calling function before declaration
sayHello(); // Outputs: Hello, I'm hoisted!
function sayHello() {
alert("Hello, I'm hoisted!");
}
As you can see, we've called the sayHello() function before it is defined, but the code still
works. This is because the function declaration is hoisted to the top automatically behind the
scenes.
Variable Hoisting
Similarly, the variable declarations are also hoisted to the top of their current scope
automatically. This means that if the variable is declared inside a function block, it will be
moved at the top of the function, but if it is declared outside any function it will be moved to
top of the script and become globally available. Take a look at the following example, to see
how this works:
Example
Try this code »
str = "Hello World!";
alert(str); // Outputs: Hello World!
var str;
However, JavaScript only hoists declarations, not initializations. That means if a variable is
declared and initialized after using it, the value will be undefined. For example:
Example
Try this code »
alert(str); // Outputs: undefined
var str;
str = "Hello World!";
Here's another example demonstrating the variable hoisting behavior of JavaScript:
Example
Try this code »
var i = 1; // Declare and initialize i
alert(i + ", " + j); // Outputs: 1, undefined
var j = 2; // Declare and initialize j
Note: It is considered best practice to declare your variables at the top of the current scope,
because of hoisting behavior. Also, using a variable without declaring is not allowed
in JavaScript strict mode. See the next chapter to learn more about the strict mode.
JavaScript Closures
Understanding the JavaScript Closures
In the JavaScript functions chapter you've learnt that in JavaScript a variable's scope can
be global or local. Since ES6 you can also create block-scoped variables using the let keyword.
A global variable can be accessed and manipulated anywhere in the program, whereas a local
variable can only be accessed and manipulated by the function they are declared in.
However, there are certain situations when you want a variable to be available throughout the
script, but you don't want just any part of your code to be able to change its value accidently.
Let's see what happens if you try to achieve this using the global variable:
Example
Try this code »
// Global variable
var counter = 0;
makeCounter();
console.log(counter); // Prints: 2
Now, let's try to achieve the same thing with the local variable and see what happens:
Example
Try this code »
function makeCounter() {
// Local variable
var counter = 0;
A closure is basically an inner function that has access to the parent function's scope, even
after the parent function has finished executing. This is accomplished by creating a function
inside another function. Let's take a look at the following example to see how it works:
Example
Try this code »
function makeCounter() {
var counter = 0;
// Nested function
function make() {
counter += 1;
return counter;
}
return make;
}
console.log(myCounter()); // Prints: 1
console.log(myCounter()); // Prints: 2
As you can see in the above example, the inner function make() is returned from the outer
function makeCounter(). So the value of the myCounter is the inner make() function (line no-
14), and calling myCounter effectively calls make(). In JavaScript functions can assigned to
variables, passed as arguments to other functions, can be nested inside other functions, and
more. You'll also notice that the inner function make() is still able to access the value
of counter variable defined in the outer function, even though the makeCounter() function
has already finished executing (line no-14). It happens because functions in JavaScript form
closures. Closures internally store references to their outer variables, and can access and update
their values.
In the example above, the make() function is a closure whose code refers to the outer
variable counter. This implies that whenever the make() function is invoked, the code inside it
is able to access and update the counter variable because it is stored in the closure.
Finally, since the outer function has finished executing, no other part of the code can access or
manipulate the counter variable. Only the inner function has exclusive access to it.
The previous example can also be written using anonymous function expression, like this:
Example
Try this code »
// Anonymous function expression
var myCounter = (function() {
var counter = 0;
console.log(myCounter()); // Prints: 1
console.log(myCounter()); // Prints: 2
Tip: In JavaScript, all functions have access to the global scope, as well as the scope above
them. As JavaScript supports nested functions, this typically means that the nested functions
have access to any value declared in a higher scope including its parent function's scope.
Note: The global variables live as long as your application (i.e. your web page) lives. Whereas,
the local variables have a short life span, they are created when the function is invoked, and
destroyed as soon as the function is finished executing.
Additionally, the setter function will also perform a quick check whether the specified value is
a number or not, and if it is not it will not change the variable value.
Example
Try this code »
var getValue, setValue;
// Self-executing function
(function() {
var secret = 0;
// Getter function
getValue = function() {
return secret;
};
// Setter function
setValue = function(x) {
if(typeof x === "number") {
secret = x;
}
};
}());
Also, features that are deprecated may also generate errors in strict mode. Hence, strict mode
reduces bugs, improves security and overall performance of your application.
Example
Try this code »
x = 5;
console.log(x); // 5
function sayHello() {
"use strict";
str = "Hello World!"; // ReferenceError: str is not defined
console.log(str);
}
sayHello();
Note: The "use strict" directive is only recognized at the beginning of a script or a function.
All modern browsers support "use strict" directive except Internet Explorer 9 and lower
versions. Additionally, the browsers that don't support the "use strict" directive silently ignore
it and parse the JavaScript in non-strict mode.
Example
Try this code »
"use strict";
function doSomething() {
msg = "Hi, there!"; // ReferenceError: msg is not defined
return msg;
}
console.log(doSomething());
Example
Try this code »
"use strict";
Example
Try this code »
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxError
Example
Try this code »
"use strict";
Example
Try this code »
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
Example
Try this code »
"use strict";
Example
Try this code »
"use strict";
Example
Try this code »
"use strict";
Example
Try this code »
"use strict";
console.log(Object.isExtensible(person)); // true
Object.freeze(person); // lock down the person object
console.log(Object.isExtensible(person)); // false
person.gender = "male"; // TypeError
Example
Try this code »
"use strict";
As per the latest ECMAScript 6 (or ES6) standards, these keywords are reserved keywords
when they are found in strict mode
code: await, implements, interface, package, private, protected, public, and static. However, for
optimal compatibility you should avoid using the reserved keywords as variable names or
function names in your program.
Tip: Reserved words, which are also called keywords, are special words that are part of the
JavaScript language syntax, for example, var, if, for, function, etc. See the JS reserved keywords
reference for a complete list of all reserved words in JavaScript.
Like XML, JSON is also a text-based format that's easy to write and easy to understand for
both humans and computers, but unlike XML, JSON data structures occupy less bandwidth
than their XML versions. JSON is based on two basic structures:
In JSON, property names or keys are always strings, while the value can be
a string, number, true or false, null or even an object or an array. Strings must be enclosed in
double quotes " and can contain escape characters such as \n, \t and \. A JSON object may
look like this:
Example
Try this code »
{
"book": {
"name": "Harry Potter and the Goblet of Fire",
"author": "J. K. Rowling",
"year": 2000,
"genre": "Fantasy Fiction",
"bestseller": true
}
}
Whereas an example of JSON array would look something like this:
Example
Try this code »
{
"fruits": [
"Apple",
"Banana",
"Strawberry",
"Mango"
]
}
Tip: A data-interchange format is a text format which is used to interchange or exchange data
between different platforms and operating systems. JSON is the most popular and lightweight
data-interchange format for web applications.
Let's suppose we've received the following JSON-encoded string from a web server:
Example
Try this code »
{"name": "Peter", "age": 22, "country": "United States"}
Now, we can simply use the JavaScript JSON.parse() method to convert this JSON string into a
JavaScript object and access individual values using the dot notation ( .), like this:
Example
Try this code »
// Store JSON data in a JS variable
var json = '{"name": "Peter", "age": 22, "country": "United States"}';
Example
Try this code »
/* Storing multi-line JSON string in a JS variable
using the new ES6 template literals */
var json = `{
"book": {
"name": "Harry Potter and the Goblet of Fire",
"author": "J. K. Rowling",
"year": 2000,
"characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
"genre": "Fantasy Fiction",
"price": {
"paperback": "$10.40", "hardcover": "$20.32", "kindle":
"$4.11"
}
}
}`;
document.write("<hr>");
Example
Try this code »
// Sample JS object
var obj = {"name": "Peter", "age": 22, "country": "United States"};
{"name":"Peter","age":22,"country":"United States"}
Note: Although, JavaScript and JSON objects look quite similar, but they are not exactly the
same. For example, in JavaScript, object property names can be enclosed in single quotes
('...') or double quotes ("..."), or you can omit the quotes altogether. But, in JSON, all
property names must be enclosed in double quotes.
Stringify a JavaScript Array
Similarly, you can convert the JavaScript arrays to JSON strings, like this:
Example
Try this code »
// Sample JS array
var arr = ["Apple", "Banana", "Mango", "Orange", "Papaya"];
["Apple","Banana","Mango","Orange","Papaya"]
Warning: Do not use eval() function to evaluate JSON data (e.g., including function
definitions in JSON string and converting them back into executable functions
with eval() method), as it allows attacker to inject malicious JavaScript code into your
application.
These types of errors are known as runtime errors, because they occur at the time the script
runs. A professional application must have the capabilities to handle such runtime error
gracefully. Usually this means informing the user about the problem more clearly and
precisely.
The try...catch Statement
JavaScript provides the try-catch statement to trap the runtime errors, and handle them
gracefully.
Any code that might possibly throw an error should be placed in the try block of the
statement, and the code to handle the error is placed in the catch block, as shown here:
try {
// Code that may cause an error
} catch(error) {
// Action to be performed when an error occurs
}
If an error occurs at any point in the try block, code execution immediately transferred from
the try block to the catch block. If no error occurs in the try block, the catch block will be
ignored, and the program will continue executing after the try-catch statement.
The following example demonstrates how the try-catch statement actually works:
Example
Try this code »
try {
var greet = "Hi, there!";
document.write(greet);
// Continue execution
document.write("<p>Hello World!</p>");
The above script will generate an error that is displayed in an alert dialog box, instead of
printing it to browser console. Besides that, the program didn't stop abruptly even though an
error has occurred.
Also, note that the catch keyword is followed by an identifier in parentheses. This identifier is
act like a function parameter. When an error occurs, the JavaScript interpreter generates an
object containing the details about it. This error object is then passed as an argument
to catch for handling.
Tip: The try-catch statement is an exception handling mechanism. An exception is signal that
indicates that some sort of exceptional condition or error has occurred during the execution
of a program. The terms "exception" and "error" are often used interchangeably.
The following example will always display the total time taken to complete the execution of
the code.
Example
Try this code »
// Assigning the value returned by the prompt dialog box to a variable
var num = prompt("Enter a positive integer between 0 to 100");
try {
if(num > 0 && num <= 100) {
alert(Math.pow(num, num)); // the base to the exponent power
} else {
throw new Error("An invalid value is entered!");
}
} catch(e) {
alert(e.message);
} finally {
// Displaying the time taken to execute the code
alert("Execution took: " + (Date.now() - start) + "ms");
}
Throwing Errors
So far we've seen the errors that are automatically thrown by JavaScript parser when an error
occurs. However, it is also possible to throw an error manually by using the throw statement.
The general form (or syntax) of the throw statement is: throw expression;
The expression can be a object or a value of any data type. However, it's better to use the
objects, preferably with name and message properties. The JavaScript built-in Error() constructor
provides a convenient way create an error object. Let's look at some examples:
Example
Try this code »
throw 123;
throw "Missing values!";
throw true;
throw { name: "InvalidParameter", message: "Parameter is not a number!" };
throw new Error("Something went wrong!");
Note: If you're using the JavaScript built-in error constructor functions
(e.g. Error(), TypeError(), etc.) for creating error objects, then the name property is same as the
name of the constructor, and the message is equal to the argument passed to the constructor
function.
Now we're going to create a function squareRoot() to find the square root of a number. This
can be done simply by using the JavaScript built-in function Math.sqrt(), but the problem here
is, it returns NaN for negative numbers, without providing any hint on what has gone wrong.
We're going to fix this problem by throwing a custom error if a negative number is supplied.
Example
Try this code »
function squareRoot(number) {
// Throw error if number is negative
if(number < 0) {
throw new Error("Sorry, can't calculate square root of a negative
number.");
} else {
return Math.sqrt(number);
}
}
try {
squareRoot(16);
squareRoot(625);
squareRoot(-9);
squareRoot(100);
There are several different types of error that can occur during the execution of a JavaScript
program, such as RangeError, ReferenceError, SyntaxError, TypeError, and URIError.
The following section describes each one of these error type in more detail:
RangeError
A RangeError is thrown when you use a number that is outside the range of allowable values.
For example, creating an array with a negative length will throw RangeError.
Example
Try this code »
var num = 12.735;
num.toFixed(200); // throws a range error (allowable range from 0 to 100)
ReferenceError
A ReferenceError is typically thrown when you try to reference or access a variable or object
that doesn't exist. The following example shows how the ReferenceError occurs.
Example
Try this code »
var firstName = "Harry";
console.log(firstname); // throws a reference error (variable names are
case-sensitive)
SyntaxError
A SyntaxError is thrown at runtime if there is any syntax problem in your JavaScript code. For
example, if closing bracket is missing, loops are not structured properly, and so on.
Example
Try this code »
var array = ["a", "b", "c"];
document.write(array.slice(2); // throws a syntax error (missing bracket)
TypeError
A TypeError is thrown when a value is not of the expected type. For example, calling a string
method on number, calling an array method on string, and so on.
Example
Try this code »
var num = 123;
num.toLowerCase(); /* throws a type error (since toLowerCase() is a string
method, a number can't be converted to lowercase) */
URIError
A URIError is thrown when you specified an invalid URI (stands for Uniform Resource Identifier)
to the URI-related functions such as encodeURI() or decodeURI(), as shown here:
Example
Try this code »
var a = "%E6%A2%B";
decodeURI(a); // throws a URI error
var b = "\uD800";
encodeURI(b); // throws a URI error
Note: There is one more error type EvalError which is thrown when an error occurs during the
execution of code via eval() function. But, this error is not thrown by JavaScript anymore,
however this object still remains for backward compatibility.
The specific error type can also be thrown manually using their respective constructor and
the throw statement, e.g., to throw a TypeError you can use the TypeError() constructor, like this:
Example
Try this code »
var num = prompt("Please enter a number");
try {
if(num != "" && num !== null && isFinite(+num)) {
alert(Math.exp(num));
} else {
throw new TypeError("You have not entered a number.");
}
} catch(e) {
alert(e.name);
alert(e.message);
alert(e.stack); // non-standard property
}
Note: The Error object also supports some non-standard properties. One of the most widely
used such property is: stack, which returns the stack trace for that error. You can use it for
debugging purposes, but don't use it on production sites.
JavaScript supports Perl style regular expressions. Why Perl style regular expressions? Because
Perl (Practical Extraction and Report Language) was the first mainstream programming
language that provided integrated support for regular expressions and it is well known for its
strong support of regular expressions and its extraordinary text processing and manipulation
capabilities.
Let's begin with a brief overview of the commonly used JavaScript's built-in methods for
performing pattern-matching before delving deep into the world of regular expressions.
exec() Search for a match in a string. It returns an array of information or null on mismatch.
search() Search for a match within a string. It returns the index of the first match, or -1 if not found.
replace() Search for a match in a string, and replaces the matched substring with a replacement string.
Function What it Does
match() Search for a match in a string. It returns an array of information or null on mismatch.
Note: The methods exec() and test() are RegExp methods that takes a string as a
parameter, whereas the methods search(), replace(), match() and split() are String
methods that takes a regular expression as a parameter.
The literal syntax uses forward slashes (/pattern/) to wrap the regular expression pattern,
whereas the constructor syntax uses quotes ("pattern"). The following example demonstrates
both ways of creating a regular expression that matches any string that begins with "Mr.".
Example
Run this code »
// Literal syntax
var regex = /^Mr\./;
// Constructor syntax
var regex = new RegExp("^Mr\\.");
As you can see, the regular expression literal syntax is shorter and easier to read. Therefore it
is preferable to use the literal syntax. We'll also use it throughout this tutorial.
Note: When using the constructor syntax, you've to double-escape special characters, which
means to match "." you need to write "\\." instead of "\.". If there is only one backslash, it
would be interpreted by JavaScript's string parser as an escaping character and removed.
The characters that are given special meaning within a regular expression, are:
. * ? + [ ] ( ) { } ^ $ | \. You will need to backslash these characters whenever you want to
use them literally. For example, if you want to match ".", you'd have to write \.. All other
characters automatically assume their literal meanings.
The following sections describe the various options available for formulating patterns:
Character Classes
Square brackets surrounding a pattern of characters are called a character class e.g. [abc]. A
character class always matches a single character out of a list of specified characters that
means the expression [abc] matches only a, b or c character.
Negated character classes can also be defined that match any character except those
contained within the brackets. A negated character class is defined by placing a caret (^)
symbol immediately after the opening bracket, like [^abc], which matches any character
except a, b, and c.
You can also define a range of characters by using the hyphen (-) character inside a character
class, like [0-9]. Let's look at some examples of the character classes:
The following example will show you how to find whether a pattern exists within a string or
not using the regular expression with the JavaScript test() method:
Example
Run this code »
var regex = /ca[kf]e/;
var str = "He was eating cake in the cafe.";
Example
Run this code »
var regex = /ca[kf]e/g;
var str = "He was eating cake in the cafe.";
var matches = str.match(regex);
alert(matches.length); // Outputs: 2
Tip: Regular expressions aren't exclusive to JavaScript. Languages such as Java, Perl, Python,
PHP, etc. use the same notation for finding patterns in text.
\s Matches any whitespace character (space, tab, newline or carriage return character).
Same as [ \t\n\r]
The following example will show you how to find and replace space with a hyphen character
in a string using regular expression with the JavaScript replace() method:
Example
Run this code »
var regex = /\s/g;
var replacement = "-";
var str = "Earth revolves around\nthe\tSun";
Repetition Quantifiers
In the previous section we've learnt how to match a single character in a variety of fashions.
But what if you want to match on more than one character? For example, let's say you want to
find out words containing one or more instances of the letter p, or words containing at least
two p's, and so on.
This is where quantifiers come into play. With quantifiers you can specify how many times a
character in a regular expression should match. Quantifiers can be applied to the individual
characters, as well as classes of characters, and groups of characters contained by the
parentheses.
The following table lists the various ways to quantify a particular pattern:
p{2,3} Matches at least two occurrences of the letter p, but not more than three occurrences.
The regular expression in the following example will splits the string at comma, sequence of
commas, whitespace, or combination thereof using the JavaScript split() method:
Example
Run this code »
var regex = /[\s,]+/;
var str = "My favourite colors are red, green and blue";
var parts = str.split(regex);
// Loop through parts array and display substrings
for(var part of parts){
document.write("<p>" + part + "</p>");
}
Position Anchors
There are certain situations where you want to match at the beginning or end of a line, word,
or string. To do this you can use anchors. Two common anchors are caret ( ^) which represent
the start of the string, and the dollar ($) sign which represent the end of the string.
The regular expression in the following example will match only those names in the names
array which start with the letter "J" using the JavaScript test() function:
Example
Run this code »
var regex = /^J/;
var names = ["James Bond", "Clark Kent", "John Rambo"];
The following table lists some of the most commonly used pattern modifiers.
m Changes the behavior of ^ and $ to match against a newline boundary (i.e. start or end of each line within a
multiline string), instead of a string boundary.
x Allows you to use whitespace and comments within a regular expression for clarity.
The following example will show you how to use the g and i modifiers in a regular expression
to perform a global and case-insensitive search with the JavaScript match() method.
Example
Run this code »
var regex = /color/gi;
var str = "Color red is more visible than color blue in daylight.";
var matches = str.match(regex); // global, case-insensitive match
console.log(matches);
// expected output: ["Color", "color"]
Similarly, the following example shows how to match at the beginning of every line in a multi-
line string using the ^ anchor and m modifier with the JavaScript match() method.
Example
Run this code »
var regex = /^color/gim;
var str = "Color red is more visible than \ncolor blue in daylight.";
var matches = str.match(regex); // global, case-insensitive, multiline
match
console.log(matches);
// expected output: ["Color", "color"]
Alternation
Alternation allows you to specify alternative version of a pattern. Alternation in a regular
expression works just like the OR operator in an if-else conditional statement. You can
specify alternation using a vertical bar (|). For example, the regexp /fox|dog|cat/ matches
the string "fox", or the string "dog", or the string "cat". Here's an example:
Example
Run this code »
var regex = /fox|dog|cat/;
var str = "The quick brown fox jumps over the lazy dog.";
var matches = str.match(regex);
console.log(matches);
// expected output: ["fox", index: 16, ...]
Note: Alternatives are evaluated from left to right until a match is found. If the left alternative
matches, the right alternative is ignored completely even if it has a match.
Grouping
Regular expressions use parentheses to group subexpressions, just like mathematical
expressions. Parentheses allow a repetition quantifier to be applied to an entire
subexpression. E.g., in regexp /go+/ the quantifier + is applied only to the last character o and
it matches the strings "go", "goo", and so on. Whereas, in regexp /(go)+/ the quantifier + is
applied to the group of characters g and o and it matches the strings "go", "gogo", and so on.
Example
Run this code »
var regex = /(go)+/i;
var str = "One day Gogo will go to school.";
var matches = str.match(regex); // case-insensitive match
console.log(matches);
// expected output: ["Gogo", "go", index: 8, ...]
Note: If the string matches the pattern, the match() method returns an array containing the
entire matched string as the first element, followed by any results captured in parentheses,
and the index of the whole match. If no matches were found, it returns null.
Tip: If the regular expression includes the g flag, the match() method only returns an array
containing all matched substrings rather than match object. Captured groups, index of the
whole match, and other properties are not returned.
Word Boundaries
A word boundary character ( \b) helps you search for the words that begins and/or ends with
a pattern. For example, the regexp /\bcar/ matches the words beginning with the pattern car,
and would match cart, carrot, or cartoon, but would not match oscar. Similarly, the
regexp /car\b/ matches the words ending with the pattern car, and would match oscar or
supercar, but would not match cart. Likewise, the /\bcar\b/ matches the words beginning
and ending with the pattern car, and would match only the word car.
The following example will highlight the words beginning with car in bold:
Example
Run this code »
var regex = /(\bcar\w*)/g;
var str = "Words begining with car: cart, carrot, cartoon. Words ending
with car: oscar, supercar.";
var replacement = '<b>$1</b>';
var result = str.replace(regex, replacement);
document.write(result);
Client-side validation is also helpful in creating better user experience, since it is faster
because validation occurs within the user's web browser, whereas server-side validation
occurs on the server, which require user's input to be first submitted and sent to the server
before validation occurs, also user has to wait for server response to know what exactly went
wrong.
In the following section we will take a closer look at how to perform JavaScript form validation
and handle any input errors found appropriately and gracefully.
Note: Client-side validation is not a substitute or alternative for server-side validation. You
should always validate form data on the server-side even if they are already validated on the
client-side, because user can disable JavaScript in their browser.
Example
Try this code »
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Simple HTML Form</title>
<link rel="stylesheet" href="style.css">
<script src="validator.js"></script>
</head>
<body>
<form name="contactForm" onsubmit="return validateForm()"
action="confirmation.php" method="post">
<h2>Application Form</h2>
<div class="row">
<label>Full Name</label>
<input type="text" name="name">
<div class="error" id="nameErr"></div>
</div>
<div class="row">
<label>Email Address</label>
<input type="text" name="email">
<div class="error" id="emailErr"></div>
</div>
<div class="row">
<label>Mobile Number</label>
<input type="text" name="mobile" maxlength="10">
<div class="error" id="mobileErr"></div>
</div>
<div class="row">
<label>Country</label>
<select name="country">
<option>Select</option>
<option>Australia</option>
<option>India</option>
<option>United States</option>
<option>United Kingdom</option>
</select>
<div class="error" id="countryErr"></div>
</div>
<div class="row">
<label>Gender</label>
<div class="form-inline">
<label><input type="radio" name="gender" value="male">
Male</label>
<label><input type="radio" name="gender" value="female">
Female</label>
</div>
<div class="error" id="genderErr"></div>
</div>
<div class="row">
<label>Hobbies <i>(Optional)</i></label>
<div class="form-inline">
<label><input type="checkbox" name="hobbies[]" value="sports">
Sports</label>
<label><input type="checkbox" name="hobbies[]" value="movies">
Movies</label>
<label><input type="checkbox" name="hobbies[]" value="music">
Music</label>
</div>
</div>
<div class="row">
<input type="submit" value="Submit">
</div>
</form>
</body>
</html>
Well, let's create a JavaScript file named "validator.js" and place the following code inside it,
then save it at the same location where you've saved the previous HTML file. Go through each
line of the following example code to understand how JavaScript validation works:
Example
Try this code »
// Defining a function to display error message
function printError(elemId, hintMsg) {
document.getElementById(elemId).innerHTML = hintMsg;
}
// Validate name
if(name == "") {
printError("nameErr", "Please enter your name");
} else {
var regex = /^[a-zA-Z\s]+$/;
if(regex.test(name) === false) {
printError("nameErr", "Please enter a valid name");
} else {
printError("nameErr", "");
nameErr = false;
}
}
// Validate country
if(country == "Select") {
printError("countryErr", "Please select your country");
} else {
printError("countryErr", "");
countryErr = false;
}
// Validate gender
if(gender == "") {
printError("genderErr", "Please select your gender");
} else {
printError("genderErr", "");
genderErr = false;
}
// Prevent the form from being submitted if there are any errors
if((nameErr || emailErr || mobileErr || countryErr || genderErr) ==
true) {
return false;
} else {
// Creating a string from input data for preview
var dataPreview = "You've entered the following details: \n" +
"Full Name: " + name + "\n" +
"Email Address: " + email + "\n" +
"Mobile Number: " + mobile + "\n" +
"Country: " + country + "\n" +
"Gender: " + gender + "\n";
if(hobbies.length) {
dataPreview += "Hobbies: " + hobbies.join(", ");
}
// Display input data in a dialog box before submitting the form
alert(dataPreview);
}
};
The value of an individual form field can be accessed and retrieved using the
syntax document.formName.fieldName.value or document.getElementsByName(name).value. But, to get
the values from a form field that supports multiple selections, like a group of checkboxes, you
need to utilize the loop statement as shown in the example above (line no-14 to 21).
Also, to check whether the format of input data is correct or not we've used the regular
expressions. It is one of the most effective techniques for validating the user inputs.
Furthermore, the above script will also display the data entered by the user in an alert dialog
box for preview purpose before submitting the form to the web server.
Tip: However, you can validate email format using regular expression. But a user might enter
an email that is correctly formatted but does not exist. So for authentic email validation, send
confirmation email to the user and verify whether the email really exists or not.
Adding Style Sheet to Beautify the Form
Finally, create the file named "style.css" and place the following code in it, then save it also at
the same location where you've saved the previous two files. These are the style rules to
beautify our form.
Example
Try this code »
body {
font-size: 16px;
background: #f9f9f9;
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
}
h2 {
text-align: center;
text-decoration: underline;
}
form {
width: 300px;
background: #fff;
padding: 15px 40px 40px;
border: 1px solid #ccc;
margin: 50px auto 0;
border-radius: 5px;
}
label {
display: block;
margin-bottom: 5px
}
label i {
color: #999;
font-size: 80%;
}
input, select {
border: 1px solid #ccc;
padding: 10px;
display: block;
width: 100%;
box-sizing: border-box;
border-radius: 2px;
}
.row {
padding-bottom: 10px;
}
.form-inline {
border: 1px solid #ccc;
padding: 8px 10px 4px;
border-radius: 2px;
}
.form-inline label, .form-inline input {
display: inline-block;
width: auto;
padding-right: 15px;
}
.error {
color: red;
font-size: 90%;
}
input[type="submit"] {
font-size: 110%;
font-weight: 100;
background: #006dcc;
border-color: #016BC1;
box-shadow: 0 3px 0 #0165b6;
color: #fff;
margin-top: 10px;
cursor: pointer;
}
input[type="submit"]:hover {
background: #0165b6;
}
Cookies are an old client-side storage mechanism that was originally designed for use by
server-side scripting languages such as PHP, ASP, etc. However, cookies can also be created,
accessed, and modified directly using JavaScript, but the process is little bit complicated and
messy.
Tip: A cookie can be up to 4 KB, including its name and values, cookies that exceed this
length are trimmed to fit. Also, each time the browser requests a page to the server, all the
data in the cookie is automatically sent to the server within the request.
Warning: Don't store sensitive data such as a password or credit card information in cookies
since it could potentially be manipulated by the malicious user.
To create or store a new cookie, assign a name=value string to this property, like this:
document.cookie = "firstName=Christopher";
A cookie value cannot contain semicolons, commas, or spaces. For this reason, you will need
to use the JavaScript's built-in function encodeURIComponent() to encode the values containing
these characters before storing it in the cookie. Likewise, you'll need to use the
corresponding decodeURIComponent() function when you read the cookie value.
document.cookie = "name=" + encodeURIComponent("Christopher Columbus");
By default, the lifetime of a cookie is the current browser session, which means it is lost when
the user exits the browser. For a cookie to persist beyond the current browser session, you will
need to specify its lifetime (in seconds) with a max-age attribute. This attribute determine how
long a cookie can be remain on the user's system before it is deleted, e.g., following cookie
will live for 30 days.
document.cookie = "firstName=Christopher; max-age=" + 30*24*60*60;
You can also specify the lifetime of a cookie with the expires attribute. This attribute takes an
exact date (in GMT/UTC format) when the cookie should expire, rather than an offset in
seconds.
document.cookie = "firstName=Christopher; expires=Thu, 31 Dec 2099 23:59:59 GMT";
Here's a function that sets a cookie with an optional max-age attribute. You can also use the
same function to delete a cookie by passing the value 0 for daysToLive parameter.
Example
Try this code »
function setCookie(name, value, daysToLive) {
// Encode value in order to escape semicolons, commas, and whitespace
var cookie = name + "=" + encodeURIComponent(value);
document.cookie = cookie;
}
}
By default, a cookie is available to all web pages in the same directory or any subdirectories of
that directory. However, if you specify a path the cookie is available to all web pages in the
specified path and to all web pages in all subdirectories of that path. For example, if the path
is set to / the cookie is available throughout a website, regardless of which page creates the
cookie.
document.cookie = "firstName=Christopher; path=/";
Further, you can use the domain attribute if you want a cookie to be available across
subdomains. By default, cookies are available only to the pages in the domain they were set
in.
There is also a boolean attribute named secure. If this attribute is specified, the cookie will be
only be transmitted over a secure (i.e. encrypted) connection such as HTTPS.
document.cookie = "firstName=Christopher; path=/; domain=example.com; secure";
Reading a Cookie
Reading a cookie is a slightly more complex because the document.cookie property simply
returns a string containing a semicolon and a space separated list of all cookies
(i.e. name=value pairs, for example, firstName=John; lastName=Doe;). This string doesn't contain
the attributes such as expires, path, domain, etc. that may have been set for the cookie.
In order to get the individual cookie from this list, you need to make use of split() method to
break it into individual name=value pairs, and search for the specific name, as shown below:
Example
Try this code »
function getCookie(name) {
// Split cookie string and get all individual name=value pairs in an
array
var cookieArr = document.cookie.split(";");
Example
Try this code »
function checkCookie() {
// Get cookie using our custom function
var firstName = getCookie("firstName");
if(firstName != "") {
alert("Welcome again, " + firstName);
} else {
firstName = prompt("Please enter your first name:");
if(firstName != "" && firstName != null) {
// Set cookie using our custom function
setCookie("firstName", firstName, 30);
}
}
}
Updating a Cookie
The only way to update or modify a cookie is to create another cookie with the
same name and path as an existing one. Creating a cookie with the same name but with a
different path then that of an existing one will add an additional cookie. Here's an example:
Example
Try this code »
// Creating a cookie
document.cookie = "firstName=Christopher; path=/; max-age=" + 30*24*60*60;
Deleting a Cookie
To delete a cookie, just set it once again using the same name, specifying an empty or arbitrary
value, and setting its max-age attribute to 0. Remember that if you've specified a path,
and domain attribute for the cookie, you'll also need to include them when deleting it.
Example
Try this code »
// Deleting a cookie
document.cookie = "firstName=; max-age=0";