→ next slide / uncover
← previous
This presentation uses HTML5. It is known to work well with recent versions of Chrome or Firefox.
The Language
Wrappers
Libraries
Other Considerations
Summary
JavaScript
(CoffeeScript)
Turbo C++
Number of Questions/Month on StackOverflow: Java (red) vs JavaScript
Breaking Monoliths
Web Services
RESTful HTTP
Browser Aggregation
> "Foo" + 1
'Foo1'
> "Foo" - 1
NaN
> "Foo" + (-1)
'Foo-1'
> 0.1 + 0.2 == 0.3
false
> 0/0
NaN
> typeof NaN
'number'
> NaN == NaN
false
> parseInt("0")
0
> parseInt("Foo")
NaN
> parseInt("07")
7
> parseInt("08")
0
> undefined == false
false
> false == null
false
> undefined == null
true
D. Crockford "JavaScript - The Good Parts"
> !![]
true
> +[][[]]
NaN
...
var f = function(){};
Java: {}
JavaScript: Functions
var createCounter= function() {
var i = 0;
return function() {
return ++i;
};
};
> var counter = createCounter()
> counter()
1
> counter()
2
object = map: keys → values
traditional and dot-notation
var o = new Object()
o.key_one = "value_one"
object literal notation
var o = {'key_one': 'value_one'}
[]
notation and utf-8
o[' 平和 ']='???'
methods & functions
o.mymethod = function(){}
(most) things in JS are an object
Java: classes ≠ objects
Ruby: classes are objects
JavaScript: class free
Object.create
v8, spidermonkey: car.__proto__
var car = {};
car.honk= function(){
return "tröööööööt"};
var my_blue_car = Object.create(car);
my_blue_car.color = "blue";
my_blue_car.honk();
since ES5
The Illusion of Classes - Constructor Functions
var my_car = new Car();
> var Car = function(){};
> Car.prototype = Object.prototype;
prototype property
instanceof
> my_car instanceof Car;
true
> my_car instanceof Object;
true
var sleep = function(duration) {
var start = (new Date()).getTime();
while ((new Date()).getTime() < start + duration){};
};
sleep(10000);
alert("10 seconds have passed")
var alertPassed = function(){
alert("10 seconds have passed");
}
setTimeout (alertPassed , 10000);
setTimeout(alert("10 seconds have passed"), 10000);
setTimeout((function() {
alert("10 seconds have passed");
}), 1000);
start = (cont) ->
filetracker = helpers.asynchelper.createTaskTracker ((err) -> cont(err))
outerDone = filetracker.createTask("outer")
push_dir = (dir) ->
fulldir = sourcedir+"/"+dir
readdir_done = filetracker.createTask(dir)
fs.readdir fulldir, (err,files) ->
else files.forEach (filename) ->
unless filename.match /^_/ # files beginning with underscore are reserved for internal couchdev and couchdb usage
fullpath = fulldir+"/"+filename
filedone = filetracker.createTask fullpath
fs.stat fullpath, (err,stat)->
if err? then filedone(err)
else
if stat.isDirectory()
docname = dir + "/" + (fullpath.match /\/([^\/]*)$/)[1]
readDocument fullpath , (err,doc)->
if err? then filedone({"readDocument":"failed for "+fullpath,"err":err})
else putDoc docname,doc, (err)->
if not err?
if (docname.match /^[\/]*_design/) then count_pushed_design_docs += 1
else count_pushed_data_docs += 1
filedone(err)
else filedone()
readdir_done()
push_dir "" if push_datadocs
push_dir "/_design" if push_designdocs
outerDone()
C++, C, Clojure, F#, Haskell, Java, Lisp, Ruby,...
Prototype.js
DOJO
JQuery
com.whatever.lib.foo.bar.mess.and.more.and.more.stuff
dependency new-hip-thing
requires com.whoknows.lib, version >= 2.7.1-SNAPSHOT
dependency freaking-old-stuff
requires com.whoknows.lib, version == 0.0.9
Namespaces: Objects (+ Closures)
Writing non trivial JavaScript is serious business.
JavaScript is not language X.
Functional programming techniques are essential.
Your JavaScript project deserves the best engineers; not the worst.
"Very good engineers cost 20% more but are 2000% more productive."
Images
http://www.flickr.com/photos/loozrboy/4887231336
http://www.flickr.com/photos/gadl/269616250/
http://www.flickr.com/photos/floridecires/4355594247/
http://www.flickr.com/photos/afternoon_sunlight/296112503/