JavaScript Gotchas Recommendations Pierre Nallet www.javascriptgotchas.com
A good return return ; return x; return { x:2 }; Always terminate statements with ; Start the returned expression on the same line
switch and break switch(dayOfWeek) { case 0: ... break; case 1: case 2: return something; ... default: throw new Error("invalid arg"); } End your case statements with break ... … or return Consider adding a default case
Don't let blocks block you if (condition) doSomething(); doSomethingElse(); Consider one line if statements if (condition){ doSomething(); } doSomethingElse(); Consider adding braces
The old parseInt parseInt("010", 10) // 10 parseFloat("010") // 10 Number("010") // 10 Always specify radix in parseInt Consider using parseFloat or Number
Number imprecision for(var i = 0; i < 10; i = i + 0.1) { ... } Terminate loops with inequalities, not equalities var noTruth = 0.3 === 0.1 + 0.2 var truth = close(0.3, 0.1 + 0.2); Remember number precision problems Consider using tolerance
Not a number is a number Remember: isNaN not the same as Number.isNaN if(isFinite(n)){ // all is good } Use isFinite to protect against non finite values if(isNaN(n)){ // Could be infinite } Consider using isNan Do not write n === NaN
A bad date var day = date.getDate(); // day of month var month = date.getMonth() + 1 // month, o Add 1 since months are zero based Use getDate to get day of month, not getDay
+ 2 + 3 "hello " + name "the number is " + num // OK 1 + someString // problem Add items of the same type Be careful when adding different types Don't use + on objects
forEach for everyone array.forEach( function(item) { // ... } ); use forEach for array iteration Do not use for loops on arrays
push your array myArray.push(post); if (index < 0 || index >= posts.length) { throw new Error('Invalid index'); } posts[index] = post; Use push to add new items to an array. Verify array bounds before writing to arrays via an index
splice, don't delete var a = [1, 2, 3, 4, 5]; a.splice(2, 1); // a contains 1,2,4,5 Use array.splice, to remove items from array Do not delete on arrays
Sorting out array.sort var numbers = [1, 5, 10]; // [1, 5, 10] numbers.sort(ascending); // [1, 5, 10] var ascending = function(x, y){ if (x > y) return 1; else if (x < y) return -1; return 0; } Use sort functions for sorting arrays You don't have to use a sort function if the array contains only strings
Arrays vs. dictionaries var dict = {}; dict.name = value1; dict.['age'] = value2; Use empty JavaScript objects for dictionaries, not arrays var array = [1,2,3] ; array[0]; Use only numbers to access array items
All equals are not equal if (userChoice == "Purchase") { // should purchase } Always be on guard against a missed = sign. Equality expression is == or ===, not =
More equality is better Use == and != only when you are sure you compare with the same type if (x === 0){ //do something } Prefer === and !== over == and !=
null is not undefined typeof x === "undefined" a.b === void 0 Checks for undefined Consider setting valid variables to null x == null Checks for null or undefined var p = {name:'Alice', age: null};
Missing the argument function addToCart(productName, quantity){ if(quantity === void 0) quantity = 1; … } Consider default parameters
var makes a difference var setup = function (mode) { var unload = mode === "Production"; // ... } Always use var when declaring variables. var setup = function (mode) { window.unload = // ... } Consider using window. when accessing global variables
namespaces var app = app || {} app.core = app.core || {} app.core.log = function() {} // ... When (potentially) reinitializing a variable, use the || syntax.
this and that function computeSum(array){ this.total = 0; var that = this; array.forEach(function(item){ that.total += item; }); } Capture this before reaching callbacks
Stay up to date www.javascriptgotchas.com

JavaScript gotchas

  • 1.
  • 2.
    A good return return; return x; return { x:2 }; Always terminate statements with ; Start the returned expression on the same line
  • 3.
    switch and break switch(dayOfWeek) { case0: ... break; case 1: case 2: return something; ... default: throw new Error("invalid arg"); } End your case statements with break ... … or return Consider adding a default case
  • 4.
    Don't let blocksblock you if (condition) doSomething(); doSomethingElse(); Consider one line if statements if (condition){ doSomething(); } doSomethingElse(); Consider adding braces
  • 5.
    The old parseInt parseInt("010",10) // 10 parseFloat("010") // 10 Number("010") // 10 Always specify radix in parseInt Consider using parseFloat or Number
  • 6.
    Number imprecision for(var i= 0; i < 10; i = i + 0.1) { ... } Terminate loops with inequalities, not equalities var noTruth = 0.3 === 0.1 + 0.2 var truth = close(0.3, 0.1 + 0.2); Remember number precision problems Consider using tolerance
  • 7.
    Not a numberis a number Remember: isNaN not the same as Number.isNaN if(isFinite(n)){ // all is good } Use isFinite to protect against non finite values if(isNaN(n)){ // Could be infinite } Consider using isNan Do not write n === NaN
  • 8.
    A bad date varday = date.getDate(); // day of month var month = date.getMonth() + 1 // month, o Add 1 since months are zero based Use getDate to get day of month, not getDay
  • 9.
    + 2 + 3 "hello" + name "the number is " + num // OK 1 + someString // problem Add items of the same type Be careful when adding different types Don't use + on objects
  • 10.
    forEach for everyone array.forEach(function(item) { // ... } ); use forEach for array iteration Do not use for loops on arrays
  • 11.
    push your array myArray.push(post); if(index < 0 || index >= posts.length) { throw new Error('Invalid index'); } posts[index] = post; Use push to add new items to an array. Verify array bounds before writing to arrays via an index
  • 12.
    splice, don't delete vara = [1, 2, 3, 4, 5]; a.splice(2, 1); // a contains 1,2,4,5 Use array.splice, to remove items from array Do not delete on arrays
  • 13.
    Sorting out array.sort varnumbers = [1, 5, 10]; // [1, 5, 10] numbers.sort(ascending); // [1, 5, 10] var ascending = function(x, y){ if (x > y) return 1; else if (x < y) return -1; return 0; } Use sort functions for sorting arrays You don't have to use a sort function if the array contains only strings
  • 14.
    Arrays vs. dictionaries vardict = {}; dict.name = value1; dict.['age'] = value2; Use empty JavaScript objects for dictionaries, not arrays var array = [1,2,3] ; array[0]; Use only numbers to access array items
  • 15.
    All equals arenot equal if (userChoice == "Purchase") { // should purchase } Always be on guard against a missed = sign. Equality expression is == or ===, not =
  • 16.
    More equality isbetter Use == and != only when you are sure you compare with the same type if (x === 0){ //do something } Prefer === and !== over == and !=
  • 17.
    null is notundefined typeof x === "undefined" a.b === void 0 Checks for undefined Consider setting valid variables to null x == null Checks for null or undefined var p = {name:'Alice', age: null};
  • 18.
    Missing the argument functionaddToCart(productName, quantity){ if(quantity === void 0) quantity = 1; … } Consider default parameters
  • 19.
    var makes adifference var setup = function (mode) { var unload = mode === "Production"; // ... } Always use var when declaring variables. var setup = function (mode) { window.unload = // ... } Consider using window. when accessing global variables
  • 20.
    namespaces var app =app || {} app.core = app.core || {} app.core.log = function() {} // ... When (potentially) reinitializing a variable, use the || syntax.
  • 21.
    this and that functioncomputeSum(array){ this.total = 0; var that = this; array.forEach(function(item){ that.total += item; }); } Capture this before reaching callbacks
  • 22.
    Stay up todate www.javascriptgotchas.com