JavaScript coding guidelines
General
- Using global variables (e.g.
global = 1) should be avoided as much as possible.
Naming conventions
- All names must be written in English.
- Variables must be written in lowercase characters separated by underscores.
Good example:
var hostid = 12345,
item_applications = [];
Bad example:
var Hostid = 12345,
itemApplications = [];
- Prefix variable names with
$only when they contain jQuery objects.
Good example:
var $widget_header = $('.widget_header', $widget),
host_count = 5;
Bad example:
var widget = $('.widget_container'),
$hosts = [$('#host1'), $('#host2')];
- Function names (except constructors) must use lower camel case.
Good example:
function create() {
// some logic here
}
function getName() {
// some logic here
}
Bad example:
function Create() {
// some logic here
}
function get_name() {
// some logic here
}
Variables
Variable declaration
-
Each variable must be declared on a separate line.
-
Multiple variables must be separated by a comma.
Good example:
var itemids = [],
item_applications = [];
Bad example:
var itemids = [];
var item_applications = [];
Bad example:
var itemids = hostids = [];
var left = null, top = null, right = null, bottom = null;
var itemIds = [],
itemApplications = [];
Objects
- Do not use quotes when creating object entities.
Good example:
var person = {firstname: 'Mario', lastname: 'Smith'};
person.firstname = 'Mr.';
Bad example:
var person = {"firstname": 'Mario', "lastname": 'Smith'};
Assignments
- Avoid multiple left-hand assignments on a single line.
Good example:
curr_lbl.style.background = background;
curr_lbl.style.color = background;
Bad example:
curr_lbl.style.background = curr_lbl.style.color = background;
- Wrap complex statements assigned to a variable in parentheses.
Good example:
var disable = (return_code === '-1' && service_enabled);
Bad example:
var disable = return_code === '-1' && service_enabled;
Conditional statements
-
The opening brace is written on the same line as the conditional statement.
-
The closing brace is always written on its own line.
Good example:
if (list.length > 100) {
// some logic here
}
Bad example:
if (list.length > 100)
{
// some logic here
}
If/Else/Else if
- "If" statements must always use curly braces {}.
Good example:
if (list.length > 100) {
// some logic here
}
if (list.length > 100) {
// some logic here
} else {
// some logic here
}
if (list.length > 100) {
// some logic here
} else if (list.length == 1) {
// some logic here
} else {
// some logic here
}
Bad example:
if (list.length > 100) // some logic here
if (list.length > 100) {
// some logic here
} else {
// some logic here
}
- Use "else" or "else if" when possible, avoiding separate "if" statements.
Good example:
if (a == b) {
d = e;
}
else if (a == c) {
d = f;
}
else {
d = g;
}
Bad example:
if (a == b) {
d = e;
}
if (a == c) {
d = f;
}
if (a != b && a != c) {
d = g;
}
Switch
- If we fall through, the comment should be present, confirming that it's intentional.
Example:
switch (condition) {
case 1:
// some logic here
// falls through
case 2:
// some logic here
break;
case 3:
// some logic here
break;
default:
// some logic here
break;
}
Try/Catch
Example:
try {
// some logic here
} catch (exception if condition) {
// some logic here
} finally {
// some logic here
}
Loops
For
Example:
for (var i = 0; i < list.length; i++) {
// some logic here
}
While
Example:
while (list.length > 0) {
// some logic here
}
Do/While
Example:
do {
// some logic here
} while (list.length > 0);
forEach() iterator
Example:
['<some_array>'].forEach(function (field) {
// some logic here
});
Formatting
- Limit lines to 200 characters.
Strings
-
Use single quotes for strings when possible.
-
Add spaces around
+in string concatenations.
Good example:
const x = 'string';
Bad example:
const x = "string";
Blank spaces
- Use a single space after commas in argument lists.
Good example:
function updateUserProfile(idx, value_int, idx2) {
// some logic here
}
Bad example:
function updateUserProfile(idx,value_int,idx2) {
// some logic here
}
-
Use spaces around binary operators, but do not add spaces between unary operators (like -, ++, --) and their operands.
-
Use a space between a keyword and the following parenthesis.
Good example:
if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
Bad example:
if(n!==0&&n!==(1/0)&&n!==-(1/0)){
n=(n>0||-1)*Math.floor(Math.abs(n));
}
- Use a space after a colon before a keyword.
Good example:
init: function(time) {
this.delay = time;
this.delayLeft = this.delay;
this.start();
}
Bad example:
init:function(time) {
this.delay = time;
this.delayLeft = this.delay;
this.start();
}
Blank lines
- Use a blank line after variable declarations, around statements, and before
return.
Good example:
var footerButton = GetData(e.target),
form = footerButton.closest('form'),
confirmText = footerButton.attr('confirm');
if (confirmText && !confirm(confirmText)) {
Event.stop(e);
return false;
}
Bad example:
var footerButton = GetData(e.target),
form = footerButton.closest('form'),
confirmText = footerButton.attr('confirm');
if (confirmText && !confirm(confirmText)) {
Event.stop(e);
return false;
}
Comments
- Use only
//double slashes for comments.
Example:
// simple comment
- Start block comments with a capital letter.
Example:
//
// New block comment.
//
-
Use full words in comments (e.g.,
parameterinstead ofparam). -
Write multiline comments using block syntax and keep within the maximum line length.
-
Omit comments if the code is self-explanatory.
Comparison
- Use
==equal or!=not equal operators when comparing numeric values to zero.
Good example:
if (itemid != 0) {}
Bad example:
if (itemid) {}
- Use
typeofto check if a variable is undefined.
Good example:
if (typeof variable !== 'undefined') {}
Bad example:
if (variable !== undefined) {}
General structure
-
Decouple logic from the main function by placing it in a separate object.
-
Keep the main function simple and avoid unnecessary complexity.
-
Exception: simple functions may remain self-contained.
Good example:
var SinteticData = {
params: {
min: 0,
// some params
},
setParams: function (params) {
// some magic here
},
getSin: function (min, max, shift, period) {
// some magic here
},
getValue: function () {
// some magic with call getSin()
}
}
try {
SinteticData.setParams(JSON.parse(value));
return SinteticData.getValue();
} catch (error) {
error += (String(error).endsWith('.')) ? '' : '.';
Zabbix.log(3, '[ DEMO ] ERROR: ' + error);
return JSON.stringify({ 'error': error });
}
Bad example:
var SinteticData = {
params: {
min: 0,
// some params
},
setParams: function (params) {
// some magic here
},
getSin: function (min, max, shift, period) {
// some magic here
}
}
try {
SinteticData.setParams(JSON.parse(value));
var tmp_data = SinteticData.getSin(SinteticData.params),
tmp_data2 = [],
tmp_out = '';
for (var i = 0; i < tmp_data.length; i++) {
// some magic with update tmp_data2
}
for (var j = 0; j < tmp_data.length; j++) {
// some magic with update tmp_out
}
return tmp_out;
} catch (error) {
error += (String(error).endsWith('.')) ? '' : '.';
Zabbix.log(3, '[ DEMO ] ERROR: ' + error);
return JSON.stringify({ 'error': error });
}
- Treat all external data structures (objects, arrays, input parameters) as unreliable and validate them before use.
For example, check the input parameters:
...
setParams: function (params) {
['min', 'max', 'shift', 'mutation_t', 'mutation_v', 'mutation_r', 'period'].forEach(function (field) {
if (typeof params === 'object' && typeof params[field] !== 'undefined' && params[field] !== '') {
SinteticData.params[field] = parseFloat(params[field]);
}
});
}
...
- Avoid directly accessing object properties by key or array element by index; use dedicated methods instead.
Good example:
var data = some_object.getField('property');
Bad example:
var data = some_object['property'];
- Always catch exceptions and provide complete information about their cause.
Good example:
try {
credentials = JSON.parse(credentials);
} catch (error) {
throw 'Failed to parse response received from instance metadata. Check debug log for more information.';
}
Bad example:
credentials = JSON.parse(credentials);
- Avoid copying blocks of code; consider using file inclusion instead.
Example:
params:
include:
- ./scripts/oci_validate_zbx_params.js
- ./scripts/oci.js
- ./scripts/compute/oci_compute_health_metrics_POST.js
- For HTTP requests, provide proxy support.
Example:
if (typeof AWS.params.proxy !== 'undefined' && AWS.params.proxy !== '') {
request.setProxy(AWS.params.proxy);
}
- For logging, use tags to identify the process.
Good example:
Zabbix.log(3, '[ AWS Billing ] ERROR: ' + error);
Bad example:
Zabbix.log(3, error);