Understanding JavaScript

Post on 14-Jul-2015

483 views 3 download

transcript

Understanding

JavaScript

Thursday, September 20, 12

Why JavaScript?

Simple

Multi paradigm

Works on the server and the browser

Lots of libraries

JSON

Thursday, September 20, 12

I heard it sucks, its broken

Implicit globals

Confusing this keyword

Confusing OO features, lack of class syntax

Type coercion

Thursday, September 20, 12

The good parts

Thursday, September 20, 12

Type system

Weak typing means that a language implicitly converts types when used.

A programming language is said to use dynamic typing when type checking is performed during run-time as opposed to compile-time.

Thursday, September 20, 12

Type system

Constructors Literals typeofObject()

Array()

RegExp()

Date()

-

Boolean()

String()

Number()

Function()

-

{a: ‘b’} ‘object’

[0, 1, ‘foo’, 3] ‘object’

/foo.*/ ‘object’

- ‘object’

null ‘object’

true false ‘boolean’

“foo” ‘bar’ string’

30 0.5 Infinity NaN ‘number’

function foo() {} ‘function’

undefined ‘undefined’

Thursday, September 20, 12

Type system: Falsy values

0

null

undefined

false

""

NaN

Thursday, September 20, 12

Type system: Coercion

undefined == undefined

",,," == new Array(4)

NaN != NaN

"wat" - 1 == NaN

{} + {} == NaN

[] + [] == “”

[] + {} == “[object Object]”

Thursday, September 20, 12

Type system

Thursday, September 20, 12

Type system/** * Adds two numbers * * @param {Number} a * @param {Number} b * @return {Number} */function add(a, b) { return a + b;}

/** * Returns the sumatory of a list of numbers * * @param {Array<Number>} list * @return {Number} */function sum(list) { return list.reduce(add, 0);}

Thursday, September 20, 12

Type system: Casting

Use the constructors Number(‘3’) === 3

Use the prefix + operator +‘3’ === 3

Use the infix + operator 3 + ‘0’ === ’30’

Use the prefix ! operator !!1 === true

Thursday, September 20, 12

Variables

Variables are function scoped

The var operator is evaluated statically

It instantiates all the variables on the current scope

It assigns them the undefined value

Assignment on variables that have not been instantiated create a global

Thursday, September 20, 12

Variables// Hoisting: Cannot read property 'name' of undefinedvar name = user.name , user = {name: 'John'};

// This creates a global!foo = ‘bar’;

// Function scopevar a = 10;

if (true) { var a = 20;}

(function () { var a = 30;}());

a == 20;

Thursday, September 20, 12

Functions: Declaration vs Expression

// Function declaration (static)function add(a, b) { return a + b;}

// Function expression (runtime)var add = function (a, b) { return a + b;}

// Function named expression (runtime)var recursiveAdd = function inc(a, b) { if (a > 100) return a; return inc(a + b, b);}

Thursday, September 20, 12

Functions: Higher order

Functions can accept functions as a parameters and can return functions

Functions are objects after all, they can even have attributes!

// Returns a function that will have a delayfunction delayFunction(fn, delay) { fn.delayed = true;

return function () { setTimeout(fn, delay); };});

Thursday, September 20, 12

Functions: Closures

Closures are function that “remember” the variables on their scope

// Gets a function to inspect the given objectfunction getInspector(obj) { return function (attr) { return obj[attr]; };};

var inspect = getInspector({name: ‘john’, age: 21});[‘name’, ‘age’].map(inspect) == [‘john’, 21];

Thursday, September 20, 12

OOP: Prototypes

Each object can have a pointer to another object called prototype

When we read an attribute from an object but its not present, it will try to find it through the prototype chain

Prototypes are powerful but can be confusing. Delegation is easy.

Thursday, September 20, 12

OOP: Prototypes

// Using non-standard __proto__var animal = {eat: true} , rabbit = {jump: true};

rabbit.__proto__ = animal;rabbit.jump === truerabbit.eat === true

// Using Object.createvar animal = {eat: true} , rabbit;

rabbit = Object.create(animal);rabbit.jump = true;

rabbit.eat === truerabbit.jump === true

Thursday, September 20, 12

OOP: ConstructorsCalling a function with the new operator makes it behave like a constructor

The keyword this will point to the newl object

The constructor will have an implicit return of the new object

The pointer to the prototype is assigned to the new object

Thursday, September 20, 12

OOP: Constructors

var animal = {eats: true};

function Rabbit(name) { this.name = name; this.jumps = true;}

Rabbit.prototype = animal;

var rabbit = new Rabbit('John')

rabbit.eats === truerabbit.jumps === truerabbit.name === ‘John’

Thursday, September 20, 12

OOP: The `this` keyword

The global object if its on the main scope

The parent object of a method if the function is called as a method

The newly created object from a constructor called with the new operator

The first argument passed to call or apply inside function code

Thursday, September 20, 12

OOP: Constructors

// globalthis.Boolean = function () {return false;};Boolean(2) === false

// method invocationvar button = { toggle: function () { this.enabled = !!this.enabled; }};button.toggle();button.enabled === true;

var toggle = button.toggle;toggle();button.enabled === true;

Thursday, September 20, 12

OOP: Constructors

// Constructorsfunction Rabbit(name) { this.name = name;}var rabbit = new Rabbit('John')rabbit.name === ‘John’;

var rabbit = Rabbit(‘John’);rabbit.name === undefined;window.name === ‘John’;

// call or apply[].reduce.call( "Javascript is cool!", function (memo, a) { return a + memo; });

Thursday, September 20, 12

Semicolons

Use them all the time

If a cool kid trolls you for using them, send them this link http://asi.qfox.nl/

Thursday, September 20, 12