47
So You Think You Know JavaScript

So You Think You Know JavaScript

Embed Size (px)

DESCRIPTION

Many folks think they know JavaScript. They know the syntax and can manipulate the DOM. Maybe they have even used jQuery. But do they really know it? I thought I did until I started digging and discovered that JavaScript is more than just a toy language for web pages. It's a full-fledged functional programming language chock full of richness. In this session, targeted at beginners, you will be introduced to some of this richness in an exciting game show format -- complete with prizes. You will learn about functions, objects, closures, and revealing modules. And you'll leave a more informed JavaScript programmer (unless, of course, you already knew JavaScript in which case you'll just leave with a prize).

Citation preview

Page 1: So You Think You Know JavaScript

So You Think You Know

JavaScript?

Page 2: So You Think You Know JavaScript

Guy Royse, ConsultantPillar [email protected]@guyroyse

Clean CodeTDD

JavaScriptPeople

Crufty CodeWorking Alone

COBOLMean People

DislikesLikes

Who is This Guy?

Page 3: So You Think You Know JavaScript

I ThoughtThat

I KnewJavaScript

Page 4: So You Think You Know JavaScript

A Word About Scope

Source: http://xkcd.com/101/

Page 5: So You Think You Know JavaScript

So You Think YouKnow JavaScript?

Page 6: So You Think You Know JavaScript

Show JavaScript Problem

Someone Tries toSolve It

Are TheyCorrect?

Dispense Candy

YESAnymore

Problems?

YES

Game Over

NO

Try Again

NO

Page 7: So You Think You Know JavaScript

Rule #1

The first personto answer correctly

winsa candy bar.

Page 8: So You Think You Know JavaScript

You may not win more than one candy bar.

So let others play the game too.

Rule #2

Page 9: So You Think You Know JavaScript

If you break Rule #2,I will give the candy bar to the skinniest person

in the room.

Rule #3

Page 10: So You Think You Know JavaScript

If you break Rule #2and are the skinniest person in the room, I will eat the candy bar.

Rule #4

Page 11: So You Think You Know JavaScript

In the event of any rules dispute it is important

to remember,I am always right.

Rule #5

Page 12: So You Think You Know JavaScript

Let’sGet

Started!

Page 13: So You Think You Know JavaScript

a) undefined -- the code will throw an exceptionb) [undefined, 'foo', 'bar']c) ['foo', 'bar', 'baz']d) [null, 'foo', 'bar‘]

a) undefined -- the code will throw an exceptionb) [undefined, 'foo', 'bar']c) ['foo', 'bar', 'baz']d) [null, 'foo', 'bar‘]

var echoEchoEcho = function(value) { var returnValue = echoEchoEcho.lastValue; echoEchoEcho.lastValue = value; return returnValue; }

var results = []; results.push(echoEchoEcho('foo')); results.push(echoEchoEcho('bar')); results.push(echoEchoEcho('baz'));

Problem #1

Page 14: So You Think You Know JavaScript

{}Many UnexpectedThings are Objects

new String('foo')new Number(42)new Boolean(true)function()

Objects or Not?'foo'

42true and false

['foo', 42, false]

Page 15: So You Think You Know JavaScript

var foo = new Object();

{}DefiningObjects

Page 16: So You Think You Know JavaScript

{}DefiningObjects

var foo = {};

Page 17: So You Think You Know JavaScript

{}DefiningObjects

var foo = { bool : true, num : 42, text : 'some text', func : function() { return 2 + 2 }, obj : { foo : 1, bar : 2 }};

Page 18: So You Think You Know JavaScript

{}ModifyingObjects

var foo = { value : 42 };

foo.value = 23; // updatefoo.otherValue = true; // createdelete foo.value; // delete

Page 19: So You Think You Know JavaScript

{}AccessingObjects

var foo = { value : 42 };

var x = foo.value;var y = foo['value'];

var val = 'value';var z = foo[val];

Page 20: So You Think You Know JavaScript

{}

[]

Page 21: So You Think You Know JavaScript

Where are the classes?

Page 22: So You Think You Know JavaScript

a) undefined -- the code will throw an exceptionb) nullc) 100d) 600

a) undefined -- the code will throw an exceptionb) nullc) 100d) 600

var Policy = function() { this.premium = 600; this.term = 6; this.calculateMonthlyAmount = function() { return this.premium / this.term; }; };

var myPolicy = Policy(); var myMonthlyAmount = myPolicy.calculateMonthlyAmount();

Problem #2

Page 23: So You Think You Know JavaScript

By defaultthis points to the global namespace

Page 24: So You Think You Know JavaScript

var balance = 200.00;

var Account = function(acctBalance) { this.balance = acctBalance; this.deposit = function(amount) { this.balance += amount; }};

var myAcct = Account(500.00);var myAcct = Account(0.0);

Page 25: So You Think You Know JavaScript

Classes in JavaScript are

a fiction

Page 26: So You Think You Know JavaScript

var Policy = function(policyNumber) { this.policyNumber = policyNumber; this.compressPolicyNumber = function() { return this.policyNumber.replace(' ', ''); };};

var policy = new Policy();

{}DefiningClasses

Page 27: So You Think You Know JavaScript

var createPolicy = function(policyNumber) { this = {}; this.policyNumber = policyNumber; this.compressPolicyNumber = function() { return this.policyNumber.replace(' ', ''); }; return this;};

{}DefiningClasses

Page 28: So You Think You Know JavaScript

{}Safer ConstructorFunction

var Foo = function() { if (!this instanceof Foo) { return new Foo(); }

this.bar = 42; this.baz = 'Hello, World!'};

Page 29: So You Think You Know JavaScript

a) undefined -- the code will throw an exceptionb) 100c) 500d) 300

a) undefined -- the code will throw an exceptionb) 100c) 500d) 300

var principal = 5000;

var calculate = function() { return this.principal * 0.10; };

var account = { principal : 1000, interest : calculate }; var loan = { principal : 2000, charge : calculate };

var amount = account.interest() + loan.charge();

Problem #3

Page 30: So You Think You Know JavaScript

function echo(value) { return value;}

{}DefiningFunctions

Page 31: So You Think You Know JavaScript

var echo = function(value) { return value;};

{}DefiningFunctions

Page 32: So You Think You Know JavaScript

var echo = function(value) { return value;};

var repeat = echo;

{}DefiningFunctions

Page 33: So You Think You Know JavaScript

()

Page 34: So You Think You Know JavaScript

{}InvokingFunctions

var echo = function(value) { return value;};

echo('Hola, mundo!');

Page 35: So You Think You Know JavaScript

{}InvokingFunctions

var object = { echo: function(value) { return value; }};object['echo']('Hola, mundo!');

var array = [object.echo];array[0]('Hola, mundo!');

Page 36: So You Think You Know JavaScript

{}ImmediateFunctions

var value = (function(value) { return value;})('Hello, World!');

Page 37: So You Think You Know JavaScript

a) undefined -- the code will throw an exceptionb) ['Marco!', 'Polo!', 'Polo!']c) ['Marco!', 'Polo!', 'Marco!]d) ['Polo!', 'Marco!', 'Polo!]

a) undefined -- the code will throw an exceptionb) ['Marco!', 'Polo!', 'Polo!']c) ['Marco!', 'Polo!', 'Marco!]d) ['Polo!', 'Marco!', 'Polo!]

var foo = function() { foo = function() { return 'Polo!'; }; return 'Marco!'; };

var results = []; results.push(foo()); results.push(foo()); results.push(foo());

Problem #4

Page 38: So You Think You Know JavaScript

This is aself-defining

function

Page 39: So You Think You Know JavaScript

{}Self-DefiningFunctions

var foo = function() { foo = function() { return 'Polo!'; }; return 'Marco!';};

var bar = foo;bar();

Page 40: So You Think You Know JavaScript

{}Functions asArguments

var foo = [1,2,3];var bar = [];

foo.forEach(function(item) { bar.push(item * 10);});

// bar == [10, 20, 30]

Page 41: So You Think You Know JavaScript

{}ArrayFunctions

[].forEach(fn)[].filter(fn)

[].every(fn)

[].some(fn)

[].sort(fn)

iterates every itemcreates new array of items

where true is returnediterates items

until false is returnediterates items

until true is returnedcomparator function

Page 42: So You Think You Know JavaScript

a) undefined -- the code will throw an exceptionb) ['foo','bar','baz']c) ['bar','baz','qux']d) ['qux','baz','bar']

a) undefined -- the code will throw an exceptionb) ['foo','bar','baz']c) ['bar','baz','qux']d) ['qux','baz','bar']

var foo = (function() { var count = 0; var values = ['foo', 'bar', 'baz', 'qux']; return function() { count++; return values[count]; }; })();

var results = [foo(), foo(), foo()];

Problem #5

Page 43: So You Think You Know JavaScript

This isa closure

Page 44: So You Think You Know JavaScript

{}PrivateVariables

var createPolicy = function(number) { var policyNumber = number; return { getPolicyNumber: function() { return policyNumber; } };};

Page 45: So You Think You Know JavaScript

{}RevealingModule

var policy = (function() { var policyNumber = '1234567890'; return { getPolicyNumber: function() { return policyNumber; } };})();

Page 46: So You Think You Know JavaScript

ThanksFor

Playing!

Page 47: So You Think You Know JavaScript

{}FurtherReading

JavaScript: The Good PartsDouglas Crockford

JavaScript PatternsStoyan Stefanov