Skip to content

fazl/javascript

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

134 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

javascript

While waiting for the twits to give me an api key so I can try out tweepy etc, let's check out a re-introduction to javascript, starting with https://bit.ly/mozilla-js-reintro-tutorial Note: At Github this file is 'marked up' i.e. easier to read. You can also read it in a markdown viewer.

Basic syntax

Super-similar to C/Java:

  • same control structures (for/while/do,switch/if/else if/else)
    • for (let i=0; i<5; i++) {...}
    • but adds 2 kinds of foreach: for( let val of array) and for( let prop in object)
    • also adds a forEach( callbackFunc ) member on arrays
    • and can switch on a string (handy)
  • same operators: arithmetic (+ - * / %) and conditional (&& || !) (inc short circuit behaviour)
    • adds extra === operator (does not promote operands):
      • 123 == '123' //true
      • 123 === '123' //false
  • same null (a la java)
    • adds special: undefined ('variable not assigned yet')

Declarations

  • let x = 1; // like C++/Java, x scoped to end of nearest block
  • const PI = 3.14; // like C/C++ (or final in Java)
  • var globalVar = 7; //Danger: this leaks globalVar name

Basic types:

Number

- floating point doubles, so beware integer arithmetic
- builtin Math obj has methods like Java Math package
- builtin parseInt(), parseFloat('value', radix) methods 
  - happily convert numeric prefix in a string eg 10abc -> 10
- short cut: prefix unary + operator converts a string arg to number
  - but it tries to consume whole string and returns NaN if extras present
  - nb NaN is 'infectious' (article says 'toxic' :-)
- taste a value with isNan() or isFinite() before consuming
  - isFinite() checks for +/-Infinity and NaN, so safer

String

- single or double quotes 
- strings are unicode, each char is 1 or 2 'code points' (2-byte words)
- length attribute on strings, returns num code points NB not bytes or chars
- Java-like methods on strings: 
    - s.charAt(n) 
    - s.toUppercase()
    - s.replace('foo', 'bar')

Boolean

  • values: true, false
  • explicitly convert: Boolean( myInt )
  • implicitly: these falsey values evaluate to false:
    • 0
    • empty strings
    • null
    • NaN and
    • undefined
  • all other values evaluate true
  • allows some nice/concise idioms:
    • var name = x && x.getName() // avoids call to getName() unless x exists
    • var name = cached || (cached=getNameSlowMethod()) //use cached copy if exists

Object

Objects are maps or collections of name,value pairs. Names are strings, values can be any javascript value.

  • Constructor syntax: var x = new Object();
  • Literal syntax (JSON): var x = {};
  • Can initialise with structure :
  var obj = {
    name: 'Carrot',
    age: 8,
    details: {
      color: 'orange',
      size: 12
    }
  };
  • Reference fields via named subscripts / sub object notation:
    • obj['details']['size'] //12 -- flexible: variables for subscripts
    • obj.details.color //'orange' -- easier to read, but hard coded names
  • Classes can be defined by a prototype function :
function Student(name, age) {
  this.name = name;
  this.age = age;
}
var you = new Student('Bob', 24);  //note keyword new
  • Classes can also be defined by a factory function.. here includes a method fullName:
function makeStudent(name, age) {
  return{
    name: name,
    age: age,
    describe: function() {
      return this.name + ' is ' + this.age + ' yrs old';
    }
  }
}
var me = makeStudent('Fred', 24);  //no new
let desc = me.describe(); // 'Fred is 24yrs old'

Modules

Javascript files that export functions, data, classes etc can be used by other code ([MDN Javascript guide][https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#Exporting_module_features]).

  • Decorate top-level artefacts to expose, with export keyword:
export function makeStudent(name, age) {
  return{
    name: name,
    age: age,
    describe: function() {
      return this.name + ' is ' + this.age + ' yrs old';
    }
  }
}
export var fred = makeStudent('Fred', 24);  
export let desc = fred.describe(); // 'Fred is 24yrs old'
  • Or, export a list of names at end of module, in {...}:
...
export {makeStudent, fred, desc};

Node.js

Turns out Node is basically like a Java VM for Javascript, runs your javascript for you on a server rather than just in a browser.

  • Strength is event-driven single threaded apparently services huge load
  • Weakness is ditto - i.e. don't use it for compute intensive services
  • Good for feeding into queue to update 'eventually consistent' database

Node modules

Javascript files that export functions, classes etc can be used by other code ([Node reference docs][https://nodejs.org/api/modules.html]).

About

Adventures in javascript

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published