JavaScript Grievances
common complaints about JavaScript
Seinfeld Festivus Airing of Grievances http://www.youtube.com/watch?v=xoirV6BbjOg
Copyright © 2012-2013 by Object Computing, Inc. (OCI). All rights reserved. Assessment Key
E - Addressed by EcmaScript 6 (ES6) D - Doesn’t really happen in practice L - Caught by Linting tools (JSLint/JSHint) and/or ES5 strict mode P - Personal preference R - Real problem Y - You can easily learn how to deal with this
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 2 JS Grievances All rights reserved. 10 - Crockford’s Bad Parts ...
Implied globals (E, L) assign to a variable without a var and it becomes global can’t do in strict mode in ES6, use let instead of var
Scope (E, Y) variables are scoped to a function body or they are global no block scope in things like if statements and loops (see let in ES6) CoffeeScript and Node.js provide file/module-scoped variables
Semicolon insertion (D, L) semicolons are optional when omitted, they are automatically inserted, sometimes not where intended hard to get wrong though
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 3 JS Grievances All rights reserved. 10 - ... Crockford’s Bad Parts ...
Reserved words (L) many aren’t currently used, but reserved for possible future use don’t have to memorize them; let a lint tool warn you
Unicode (E, D) uses UTF-16 characters, not UTF-8, and string methods expect only 2-byte characters, not 4 characters in all modern languages only require 2 bytes
typeof (Y)
typeof null === 'object' and typeof [1, 2, 3] === 'object'
Numbers (E, D) all are represented by a double; no integer type, but can accurately represent up to 53 bits which is large enough for almost all uses
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 4 JS Grievances All rights reserved. 10 - ... Crockford’s Bad Parts
Arrays (E, D) represents arrays as objects where keys are string versions of indexes a potential performance issue; but not typically ES6 adds typed arrays of numbers
Falsy values (Y) false, undefined, null, 0, NaN and "" are all treated as false in boolean contexts everything else is truthy
== vs. === and != vs. !== (L) short forms perform type coercion, long forms do not
eval(code) (D, L) need to be careful about source of code
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 5 JS Grievances All rights reserved. 10 - More Complaints ...
Implicit type coercions (D, L) Google “Gary Bernhardt WAT”
Verbose function keyword (E, R) can use arrow functions in ES6
Object keys must be strings (E, R)
can use Map and Set collections in ES6
No fancy collections (D, E, R) like sets and maps, only Array and Object can use Map and Set collections in ES6
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 6 JS Grievances All rights reserved. 10 - ... More Complaints ...
Prototypal inheritance (E, R, Y) many steps to get right
call superclass ctor in subclass ctor
set subclass .prototype to an instance of superclass
set subclass .prototype.constructor to subclass ctor
can use class and extends keywords in ES6
Ability to add/override functions and methods (D) far away from other related definitions a.k.a. monkey patching
Dynamically typed (P) some prefer static typing can use TypeScript
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 7 JS Grievances All rights reserved. 10 - ... More Complaints
No require/import/include capability (E, R) each client-side JavaScript file must be referenced from a script tag in HTML or use something like RequireJS Node provides CommonJS-style require ES6 provides modules
Need to learn async programming style (Y) callback functions and avoiding deeply nested calls
Supports mutable things (P) can use ClojureScript
Don’t like braces, parens and semicolons (P) can use CoffeeScript
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 8 JS Grievances All rights reserved. 10 - Good Parts ...
First-class functions store in variables, pass to other functions, return from other functions a necessary feature for functional programming
Closures functions capture data in the scope where they are defined
Anonymous functions
Functions are objects can attach properties with any kind of value, even other functions
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 9 JS Grievances All rights reserved. 10 - ... Good Parts ...
Objects are like maps can add arbitrary properties whose values are data and functions
JSON serialization JSON.stringify(value) and JSON.parse(string)
JavaScript experience carries over to server-side programming using Node.js
Can use CoffeeScript, ClojureScript and other languages that compile to JavaScript instead
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 10 JS Grievances All rights reserved. 10 - ... Good Parts
JavaScript IS THE ONLY PROGRAMMING LANGUAGE SUPPORTED BY ALL POPULAR WEB BROWSERS!
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 11 JS Grievances All rights reserved. 10 - Stop the Hate!
Typically Twitter comments OH: JavaScript sucks ... ha, ha, ha! TIL: JavaScript is lame.
Truth You can implement nearly any application successfully in nearly any programming language. Everyone has personal preferences. There will never be a programming language that is everyone’s favorite. Hate fragments the community and reduces opportunities for learning from each other.
Copyright © 2012-2014 by Object Computing, Inc. (OCI). 12 JS Grievances All rights reserved. 10 -