forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| =======================
 | |
| JavaScript Coding style
 | |
| =======================
 | |
| 
 | |
| Coding style
 | |
| ~~~~~~~~~~~~
 | |
| 
 | |
| `prettier <https://prettier.io/>`_ is the tool used to reformat the JavaScript code.
 | |
| 
 | |
| 
 | |
| Methods and functions
 | |
| ~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| In JavaScript, functions should use camelCase, but should not capitalize
 | |
| the first letter. Methods should not use the named function expression
 | |
| syntax, because our tools understand method names:
 | |
| 
 | |
| .. code-block:: cpp
 | |
| 
 | |
|    doSomething: function (aFoo, aBar) {
 | |
|      ...
 | |
|    }
 | |
| 
 | |
| In-line functions should have spaces around braces, except before commas
 | |
| or semicolons:
 | |
| 
 | |
| .. code-block:: cpp
 | |
| 
 | |
|    function valueObject(aValue) { return { value: aValue }; }
 | |
| 
 | |
| 
 | |
| JavaScript objects
 | |
| ~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| .. code-block:: cpp
 | |
| 
 | |
|    var foo = { prop1: "value1" };
 | |
| 
 | |
|    var bar = {
 | |
|      prop1: "value1",
 | |
|      prop2: "value2"
 | |
|    };
 | |
| 
 | |
| Constructors for objects should be capitalized and use Pascal Case:
 | |
| 
 | |
| .. code-block:: cpp
 | |
| 
 | |
|    function ObjectConstructor() {
 | |
|      this.foo = "bar";
 | |
|    }
 | |
| 
 | |
| 
 | |
| Operators
 | |
| ~~~~~~~~~
 | |
| 
 | |
| In JavaScript, overlong expressions not joined by ``&&`` and
 | |
| ``||`` should break so the operator starts on the second line and
 | |
| starting in the same column as the beginning of the expression in the
 | |
| first line. This applies to ``?:``, binary arithmetic operators
 | |
| including ``+``, and member-of operators. Rationale: an operator at the
 | |
| front of the continuation line makes for faster visual scanning, as
 | |
| there is no need to read to the end of line. Also there exists a
 | |
| context-sensitive keyword hazard in JavaScript; see {{bug(442099, "bug",
 | |
| 19)}}, which can be avoided by putting . at the start of a continuation
 | |
| line, in long member expression.
 | |
| 
 | |
| In JavaScript, ``==`` is preferred to ``===``.
 | |
| 
 | |
| Unary keyword operators, such as ``typeof``, should have their operand
 | |
| parenthesized; e.g. ``typeof("foo") == "string"``.
 | |
| 
 | |
| Literals
 | |
| ~~~~~~~~
 | |
| 
 | |
| Double-quoted strings (e.g. ``"foo"``) are preferred to single-quoted
 | |
| strings (e.g. ``'foo'``), in JavaScript, except to avoid escaping
 | |
| embedded double quotes, or when assigning inline event handlers.
 | |
| 
 | |
| 
 | |
| Prefixes
 | |
| ~~~~~~~~
 | |
| 
 | |
| -  k=constant (e.g. ``kNC_child``). Not all code uses this style; some
 | |
|    uses ``ALL_CAPS`` for constants.
 | |
| -  g=global (e.g. ``gPrefService``)
 | |
| -  a=argument (e.g. ``aCount``)
 | |
| 
 | |
| -  JavaScript Specific Prefixes
 | |
| 
 | |
|    -  \_=member (variable or function) (e.g. ``_length`` or
 | |
|       ``_setType(aType)``)
 | |
|    -  k=enumeration value (e.g. ``const kDisplayModeNormal = 0``)
 | |
|    -  on=event handler (e.g. ``function onLoad()``)
 | |
|    -  Convenience constants for interface names should be prefixed with
 | |
|       ``nsI``:
 | |
| 
 | |
|       .. code-block:: javascript
 | |
| 
 | |
|          const nsISupports = Components.interfaces.nsISupports;
 | |
|          const nsIWBN = Components.interfaces.nsIWebBrowserNavigation;
 | |
| 
 | |
| 
 | |
| 
 | |
| Other advices
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| -  Make sure you are aware of the `JavaScript
 | |
|    Tips <https://developer.mozilla.org/docs/Mozilla/JavaScript_Tips>`__.
 | |
| -  Do not compare ``x == true`` or ``x == false``. Use ``(x)`` or
 | |
|    ``(!x)`` instead. ``x == true``, is certainly different from if
 | |
|    ``(x)``! Compare objects to ``null``, numbers to ``0`` or strings to
 | |
|    ``""``, if there is chance for confusion.
 | |
| -  Make sure that your code doesn't generate any strict JavaScript
 | |
|    warnings, such as:
 | |
| 
 | |
|    -  Duplicate variable declaration.
 | |
|    -  Mixing ``return;`` with ``return value;``
 | |
|    -  Undeclared variables or members. If you are unsure if an array
 | |
|       value exists, compare the index to the array's length. If you are
 | |
|       unsure if an object member exists, use ``"name"`` in ``aObject``,
 | |
|       or if you are expecting a particular type you may use
 | |
|       ``typeof(aObject.name) == "function"`` (or whichever type you are
 | |
|       expecting).
 | |
| 
 | |
| -  Use ``['value1, value2']`` to create a JavaScript array in preference
 | |
|    to using
 | |
|    ``new {{JSxRef("Array", "Array", "Syntax", 1)}}(value1, value2)``
 | |
|    which can be confusing, as ``new Array(length)`` will actually create
 | |
|    a physically empty array with the given logical length, while
 | |
|    ``[value]`` will always create a 1-element array. You cannot actually
 | |
|    guarantee to be able to preallocate memory for an array.
 | |
| -  Use ``{ member: value, ... }`` to create a JavaScript object; a
 | |
|    useful advantage over ``new {{JSxRef("Object", "Object", "", 1)}}()``
 | |
|    is the ability to create initial properties and use extended
 | |
|    JavaScript syntax, to define getters and setters.
 | |
| -  If having defined a constructor you need to assign default
 | |
|    properties, it is preferred to assign an object literal to the
 | |
|    prototype property.
 | |
| -  Use regular expressions, but use wisely. For instance, to check that
 | |
|    ``aString`` is not completely whitespace use
 | |
|    ``/\S/.{{JSxRef("RegExp.test", "test(aString)", "", 1)}}``. Only use
 | |
|    {{JSxRef("String.search", "aString.search()")}} if you need to know
 | |
|    the position of the result, or {{JSxRef("String.match",
 | |
|    "aString.match()")}} if you need to collect matching substrings
 | |
|    (delimited by parentheses in the regular expression). Regular
 | |
|    expressions are less useful if the match is unknown in advance, or to
 | |
|    extract substrings in known positions in the string. For instance,
 | |
|    {{JSxRef("String.slice", "aString.slice(-1)")}} returns the last
 | |
|    letter in ``aString``, or the empty string if ``aString`` is empty.
 | 
