Píndoles JavaScript
JSDoc
JSDoc permet fer anotacions a JavaScript per a fer comprovacions de tipus i documentar el codi. Si s'utilitza VSCode podem activar aquesta comprovació afegint un arxiu jsconfig.json
amb les propietats strict
i checkJs
:
{
"compilerOptions": {
"strict": true,
"checkJs": true
}
}
Variables
Podem definir el tipus d'una variable:
/** @type {number} */
let result1;
Si la definició té una assignació, JSDoc infereix el seu tipus i no caldria indicar-lo:
let result2 = 0;
Tot i que JavaScript ho permetria, JSDoc no permet canviar el tipus d'una variable.
Funcions
Podem documentar la funció, els seus paràmetres i el valor retornat.
/**
* Add two numbers
* @param {number} number1
* @param {number} number2
* @returns {number}
*/
function add(number1, number2) {
return number1 + number2;
}
JSDoc mostrarà un problema si intentem utilitzar aquesta funció amb un paràmetre que no sigui de tipus number, o bé si intentem assignar el resultat a una variable que no sigui number.
Tipus
Podem indicar els tipus entre dues claus.
- Els primitius:
boolean
,string
,number
. - Els arrays, amb les claus quadrades, p. ex:
string[]
. - Els objectes es poden definir amb
@typedef
.
/**
* User object, surname is optional.
* @typedef {Object} User
* @property {number} id
* @property {string} name
* @property {string} [surname]
* @property {boolean} active
*/
- Les funcions callback es poden definir amb
@callback
, l'equivalent atypedef
per a callbacks:
/**
* A callback function applicable to a number
* @callback ApplyFunc
* @param {number} number
* @returns {number}
*/
O bé directament utilitzant el tipus function
:
/** @type {function(number):string} */
let stringerFn = (num) => (num.toString());
- Podem definir que un paràmetre o variable pot tenir més d'un tipus amb l'OR.
/** @type {number | undefined} */
- Podem fer casting de tipus:
const inputEl = /** @type {HTMLInputElement} */ (document.querySelector('input'));
És important utilitzar parèntesis sobre l'element castejat
- Podem fer tipus condicional:
/**
* @returns {string | number}
*/
function getValue() {
return Math.random() > 0.5? String(17) : 17;
}
const value = getValue();
if (typeof value === 'string') {
// type is string for this block
console.log(`length is ${value.length}`);
}
if (typeof value === 'number') {
// type is number for this block
console.log(`square is ${value*value}`);
}
Desactivació d'errors
Podem desactivar l'error de la línea següent amb:
// @ts-ignore
Podem desactivar tots els errors d'un arxiu amb:
// @ts-nocheck
o activar-los per a un arxiu, si per defecte estan desactivats, amb:
// @ts-check
Precedència d'operadors
Precedence | Operator type | Associativity | Individual operators |
---|---|---|---|
18 | Grouping | n/a | ( … ) |
17 | Member Access | left-to-right | … . … |
Optional chaining | … ?. … |
||
Computed Member Access | n/a | … [ … ] |
|
new (with argument list) |
new … ( … ) |
||
Function Call | … ( … ) |
||
16 | new (without argument list) |
n/a | new … |
15 | Postfix Increment | n/a | … ++ |
Postfix Decrement | … -- |
||
14 | Logical NOT (!) | n/a | ! … |
Bitwise NOT (~) | ~ … |
||
Unary plus (+) | + … |
||
Unary negation (-) | - … |
||
Prefix Increment | ++ … |
||
Prefix Decrement | -- … |
||
typeof |
typeof … |
||
void |
void … |
||
delete |
delete … |
||
await |
await … |
||
13 | Exponentiation (**) | right-to-left | … ** … |
12 | Multiplication (*) | left-to-right | … * … |
Division (/) | … / … |
||
Remainder (%) | … % … |
||
11 | Addition (+) | left-to-right | … + … |
Subtraction (-) | … - … |
||
10 | Bitwise Left Shift (<<) | left-to-right | … << … |
Bitwise Right Shift (>>) | … >> … |
||
Bitwise Unsigned Right Shift (>>>) | … >>> … |
||
9 | Less Than (<) | left-to-right | … < … |
Less Than Or Equal (<=) | … <= … |
||
Greater Than (>) | … > … |
||
Greater Than Or Equal (>=) | … >= … |
||
in |
… in … |
||
instanceof |
… instanceof … |
||
8 | Equality (==) | left-to-right | … == … |
Inequality (!=) | … != … |
||
Strict Equality (===) | … === … |
||
Strict Inequality (!==) | … !== … |
||
7 | Bitwise AND (&) | left-to-right | … & … |
6 | Bitwise XOR (^) | left-to-right | … ^ … |
5 | Bitwise OR (|) | left-to-right | … | … |
4 | Logical AND (&&) | left-to-right | … && … |
3 | Logical OR (||) | left-to-right | … || … |
Nullish coalescing operator (??) | … ?? … |
||
2 | Assignment | right-to-left | … = … |
… += … |
|||
… -= … |
|||
… **= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
… &&= … |
|||
… ||= … |
|||
… ??= … |
|||
Conditional (ternary) operator | right-to-left (Groups on expressions after ? ) |
… ? … : … |
|
Arrow (=>) | right-to-left | … => … |
|
yield |
n/a | yield … |
|
yield* |
yield* … |
||
Spread (...) | ... … |
||
1 | Comma / Sequence | left-to-right | … , … |