What is JavaScript?
JavaScript Tools
Data Types
Functions
Objects
Array
JavaScript is a front-end scripting language developed by Netscape for dynamic content
Lightweight, but with limited capabilities
Can be used as object-oriented language
Embedded in your HTML page
Interpreted by the Web browser
Client-side, mobile and desktop technology
Simple and flexible
Powerful to manipulate the DOM
JavaScript allows interactivity such as:
Implementing form validation
React to user actions, e.g. handle keys
Changing an image on moving mouse over it
Sections of a page appearing and disappearing
Content loading and changing dynamically
Performing complex calculations
Custom HTML controls, e.g. scrollable table
Implementing AJAX functionality
JavaScript can:
handle events
read and write HTML elements and modify the DOM tree
validate form data
access / modify browser cookies
detect the user's browser and OS
be used as object-oriented language
handle exceptions
perform asynchronous server calls (AJAX)
The JavaScript code can be placed in:
<script> tag in the head
<script> tag in the body - not recommended
External files, linked via <script> tag the head
Files usually have .js extension
Highly recommended
The .js files get cached by the browser
<scriрt type="text/javascript">
console.log('Hello World!');
</scriрt>
JavaScript code is executed during the page loading or when the browser fires an event
All statements are executed at page loading
Some statements just define functions that can be called later
No compile time checks
Function calls or code can be attached as "event handlers" via tag attributes
Executed when the event is fired by the browser
<img src="logo.gif" onclick="alert('clicked!')" />
Using external script files
<html>
<head>
<scriрt src="sample.js" type="text/javascript">
</scriрt>
</head>
<body>
<button onclick="hello()" value="Call JavaScript
function from sample.js"></button>
</body>
</html>
Contents of the external file sample.js
function hello() {
alert('Hello from sample.js!')
}
The JavaScript syntax is kind of similar to C#
Operators (+, *, =, !=, &&, ++, …)
Variables (weakly typed)
Conditional statements (if, else)
Loops (for, while)
Arrays (my_array[]) and associative arrays (my_array['abc'])
Functions (can return value)
JavaScript is an interpreted language
It can be ran on the browser or locally
The means to acquire the JavaScript code are trivial
No matter how or where it is coded
You can even code it in Notepad
Yet, there are many tools that make JavaScript coding eaiser
Like editors, debuggers, etc…
Node.js is a server-side platform that uses JavaScript
Runs the V8 JS interpreter
Allows creating end-to-end apps with JavaScript
Usable to test & learn JavaScript Syntax
Visit the Node.js website: https://nodejs.org/
Install via the Installer or NVM
Node.js once installed on the machine and can be used through the CMD/Terminal
In the CMD/Terminal run node -v
All a developer needs for writing JavaScript is a text editor - could be even Notepad/Notepad++, yet, there are lots of options:
Text editors with plugins
VS Code
Sublime
Atom
IDEs
Visual Studio with Web Essentials plugin
Jetbrains Webstorm
There is no universal way of debugging client-side JavaScript
The only reliable way to debug client-side JavaScript is through the browser
Fortunately all browsers have their own debugging tool/plugin that makes it easier
Firefox has Firebug
Chrome and Opera have Web developer tools
Internet Explorer and Edge have F12
HTML, CSS and JavaScript playgrounds
JavaScript performance tester
When sharing code with your peers
http://pastebin.com/, https://gist.github.com/ or other similar tools
Local variables - declared with the keywords var, let or const
var - the variable lives in the scope of the current function or in the global scope
let - the variables lives in the current scope
const - like let, but cannot be reassigned
Global variables
Declared without any keyword
Bad practice - never do this!
JavaScript is weakly typed language
allows most operations on values without regards to type
values have types, variables don't
variables can hold any type of value
var count = 5; // variable holds an integer value
count = 'hello'; // the same variable now holds a string
var name = 'Telerik Academy'; // variable holds a string
let mark = 5.25 // mark holds a floating-point number
mark = true; // mark now holds a boolean value
const MAX_COUNT = 250; // name is a constant variable that holds a string
MAX_COUNT = 0; // error, cannot assign to a constant variable
JavaScript is a weakly typed language
Variables don’t have type, but their values do
JavaScript has seven different types:
Number, String, Boolean, Symbol, Null, Undefined and Object (yes, Arrays are of type Object)
Object is the only reference type
It is passed by reference (every time an object's value is used, it's used through a reference)
Number, String, Boolean, Symbol, Null, Undefined are primitive types, passed by value (they're copied each time their value is used)
Seemingly different values equate to true when compared with == (loose or abstract equality)
JavaScript (effectively) converts each to a string representation before comparison:
// all true
1 == '1';
1 == [1];
'1' == [1];
A more obvious false result occurs when comparing with === (strict equality) because the type is also considered:
// all false
1 === '1';
1 === [1];
'1' === [1];
The following values are always falsy (false-like):
false, 0, '' or "" (empty string)
null, undefined, NaN (e.g. the result of 1/0)
Everything else is truthy. That includes:
'0' (a string containing a single zero)
'false' (a string containing the text “false”)
[] (an empty array)
{} (an empty object)
function(){} (an “empty” function)
JavaScript has a special value undefined
It means the variable has not been defined (no such variable in the current context)
undefined is different than null
null represents an empty value
let x;
console.log(x); // undefined
x = 5;
console.log(x); // 5
x = undefined;
console.log(x); // undefined
x = null;
console.log(x); // null
Each function has a name
It is used to call the function
Describes its purpose
Functions in JavaScript do not explicitly define return type
Each function always returns a value
function print(dataToPrint) {
console.log(dataToPrint);
}
Functions can be defined in several ways:
// By function declaration
function print(data) { console.log(data) };
// By function expression
var print = function (data) { console.log(data) };
// By using arrow functions
var print = (data) => console.log(data);
Functions can have as many parameters as needed:
function printMax(x, y) {
var max;
x = +x; y = +y;
max = x;
if (y > max) {
max = y;
}
console.log(`Maximal number: ${max}`);
}
Every function in JavaScript has an implicit parameter arguments
It holds information about the function and all the parameters passed to the function
No need to be explicitly declared
It exists in every function
function printArguments() {
for(let i in arguments) {
console.log(arguments[i]);
}
}
printArguments(1, 2, 3, 4); // will print 1, 2, 3, 4
Every function in JavaScript returns a value
Returns undefined implicitly
Can be set explicitly
The return value can be of any type
Number, String, Object, Function..
Use return keyword to return a result
function multiply (firstNum, secondNum) {
return firstNum * secondNum;
}
JavaScript is designed on a simple object-based paradigm
An object is a collection of properties
An object property is association between a name and a value
A value of property can be either a method (function) or a field (variable)
Lots of predefined objects available in JS
Math, document, window, etc…
Objects can be created by the developer
Each object has properties
Properties are values attached to the object
Properties of an object can be accessed with a dot-notation (. operator) or with [] - indexer:
let arrStr = arr.join(', '); // property join of Array
let length = arr.length; // property length of Array
let words = text.split(' ');
let words = text['split'](' ');
JavaScript object literal is a simplified way to create objects
Using curly brackets:
let person = {
firstName: 'Viktor',
lastName: 'Tsvetkov',
toString: function () {
return this.firstName + ' ' + this.lastName;
}
};
// object properties can be used:
console.log(person.toString());
// writes 'Viktor Tsvetkov'
Lets make two people:
let minkov = {
fname: 'Doncho',
lname: 'Minkov',
toString: function() {
return this.fname + ' ' + this.lname;
}
};
let georgiev = {
fname: 'Georgi',
lname: 'Georgiev',
toString: function() {
return this.fname + ' ' + this.lname;
}
};
Object notations are great, but repeating code is not, right?
Using a function for building objects
Just pass first and last name and get a object
Something like a constructor
function makePerson(fname, lname) {
return {
fname: fname,
lname: lname,
toString: function () {
return this.fname + ' ' + this.lname;
}
}
}
let minkov = makePerson('Doncho', 'Minkov');
let georgiev = makePerson('Georgi', 'Georgiev');
Using ES6, we can create objects from a class:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
toString() {
return this.firstName + ' ' + this.lastName;
}
}
let minkov = new Person('Doncho', 'Minkov');
let georgiev = new Person('Georgi', 'Georgiev');
An array is a sequence of elements
The order of the elements is fixed
Does not have fixed size
// Array holding numbers
let numbers = [1, 2, 3, 4, 5];
// Array of different types
let mixedArr = [1, new Date(), 'hello'];
// Array of arrays (matrix)
let matrix = [
['0,0', '0,1', '0,2'],
['1,0', '1,1', '1,2'],
['2,0', '2,1', '2,2']
];
All arrays in JavaScript are dynamic
Their size can be changed at runtime
New elements can be inserted to the array
Elements can be removed from the array
[].push(element)
Inserts a new element at the tail of the array
[].pop()
Removes the element at the tail
Returns the removed element
[].unshift(element)
Inserts a new element at the head of the array
[].shift()
Removes the element at the head
Returns the remove element
[].reverse()
Reverses the elements of the array
Returns a new arrays
var items = [1, 2, 3, 4, 5, 6];
var reversed = items.reverse();
//reversed = [6, 5, 4, 3, 2, 1]
[].join(separator)
Concatenates the elements with a separator
Returns a string
var names = ["John", "Jane", "George", "Helen"];
var namesString = names.join(", ");
//namesString = "John, Jane, George, Helen"
arr1.concat(arr2)
Inserts the elements of arr2 at the end of arr1
Returns a new array
arr1 and arr2 remain unchanged!
var arr1 = [1, 2, 3];
var arr2 = ["one", "two", "three"];
var result = arr1.concat(arr2);
//result = [1, 2, 3, "one", "two", "three"]
Adding the elements of an array to other array
var arr1 = [1, 2, 3];
var arr2 = ["one", "two", "three"];
[].push.apply(arr1, arr2);
//arr1 = [1, 2, 3, "one", "two", "three"]
[].slice(fromIndex [, toIndex])
Returns a new array
A shallow copy of a portion of the array
The new array contains the elements from indices fromIndex to to (excluding toIndex)
Can be used to clone an array
var items = [1, 2, 3, 4, 5];
var part = items.slice(1, 3);
//part = [2, 3]
var clonedItems = items.slice();
[].splice(index, count, elements)
Removes count elements, starting from index position
Adds elements at position index
Returns a new array, containing the removed elements
var numbers = [1, 2, 3, 4, 5, 6, 7];
var result = numbers.splice(3, 2, "four", "five", "five.five");
//result = [4, 5]
//numbers = [1, 2, 3, "four", "five", "five.five", 6, 7];
[].indexOf(element [, rightOf])
Returns the index of the first match in the array
Returns -1 is the element is not found
[].lastIndexOf(element, [leftOf])
Returns the index of the first match in the array
Returns -1 is the element is not found
[].indexOf() and [].lastIndexOf() do not work in all browsers
Need to be shimmed