Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.

View in English Always switch to English

Adición (+)

Baseline
Ampliamente disponible

Esta característica está consolidada y funciona en muchos dispositivos y versiones de navegador. Está disponible en todos los navegadores desde julio de 2015.

El operador de adición (+) produce la suma de operandos numéricos o la concatenación de string.

Pruébalo

console.log(2 + 2);
// Salida esperada: 4

console.log(2 + true);
// Salida esperada: 3

console.log("Hola " + "a todos");
// Salida esperada: "Hola a todos"

console.log(2001 + ": A Space Odyssey");
// Salida esperada: "2001: A Space Odyssey"

Sintaxis

js
x + y

Descripción

El operador (+) se sobrecarga para dos operaciones distintas: suma numérica y concatenación de string (cadena de caracteres). Cuando se evalúa, primero coerciona ambos operandos a sus valores primitivos. Después, los tipos de los dos operandos se comprueban en el siguiente orden:

  • Si un lado es un string, el otro operando también se convierte a string y ambos se concatenan.
  • Si ambos son BigInts, se realiza la suma de BigInt. Si un lado de la operación es un BigInt y el otro no, la operación arroja un TypeError.
  • Como última opción, ambos valores se convierten a números y se realiza la suma numérica.

La concatenación de strings es frecuentemente pensada como equivalente con plantillas literales o con String.prototype.concat(), pero no lo son. La suma coerciona a la expresión hacia un primitivo, lo que llama prioritariamente a valueOf(); por otro lado, las plantillas literales y concat() coercionan la expresión a un string, el cual llama prioritariamente a toString(). Si la expresión tiene un método [Symbol.toPrimitive](), la concatenación de string lo llama con "default" como indicio, mientras que una plantilla literal usa "string". Esto es importante para objetos que tienen diferentes representaciones de string y primitivo, como es el caso de Temporal, cuyos objetos lanzan una excepción en todos sus métodos valueOf().

js
const t = Temporal.Now.instant();
"" + t; // Arroja TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat(t); // '2022-07-31T04:48:56.113918308Z'

Se recomienda no usar "" + x para realizar la coerción a string.

Ejemplos

Adición numérica

js
1 + 2; // 3

Los demás valores que no son string ni BigInt se coercionan a números:

js
true + 1; // 2
false + false; // 0

Adición usando BigInts

js
1n + 2n; // 3n

No puedes mezclar operandos BigInt y numérico en una suma. null, undefined, y valores booleanos son coercionados a números y quedan prohibidos también.

js
1n + 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 + 1n; // TypeError: Cannot mix BigInt and other types, use explicit conversions

Los string tienen prioridad sobre otros tipos, así que sumar un string a un BigInt produce una concatenación de string en vez de un TypeError.

js
"1" + 2n; // "12"

Para realizar una suma entre un operando BigInt y uno que no es BigInt, convierte cualquiera de los operandos:

js
1n + BigInt(2); // 3n
Number(1n) + 2; // 3

Concatenación de strings

Si uno de los operandos es un string, el otro operando es convertido a string y son concatenados:

js
"fut" + "bol"; // "futbol"
5 + "bol"; // "5bol"
"fut" + false; // "futfalse"
"2" + 2; // "22"

Especificaciones

Especificación
ECMAScript® 2027 Language Specification
# sec-addition-operator-plus

Compatibilidad con navegadores

Véase también