¿Hay alguna diferencia entre bag= bag + n - i +1 y bag += n - i + 1 bcs? Se muestra diferente al ejecutar un programa a continuación:
var n = 5 for (i = 1; i <= n; i++) { var bag = "" for (j = 1; j <= n - i + 1; j++) { bag += n - j + 1 } console.log(bag) } // 2nd way var n = 5; // for (let i = 1; i <= n; i++) { var string = ""; for (let j = 1; j <= n - i + 1; j++) { string = string + n - j + 1; } console.log(string); }bag = bag + n - i + 1 y bag += n - i + 1 no son lo mismo.
bag se obliga a un númeroLa coacción se produce en el operador de resta:
console.log('' + 1); //=> '1' console.log('' - 1); //=> -1Sí, hay una diferencia. La diferencia tiene que ver con el orden en que se evalúan sus operadores:
bag += n - i + 1es lo mismo que:
bag = bag + (n - i + 1) // string concatenation as `bag` is a string and we're using `+` Observe que n - i + 1 está agrupado ( ( ) ) porque está en el lado derecho de += , por lo que se evalúa/calcula primero antes de concatenarse con la bag de cadenas. Las dos líneas de código anteriores son diferentes de su otra alternativa de:
bag = bag + n - i +1Aquí no hay agrupación, por lo que el orden en que se evalúan los operadores es diferente (ver precedencia de operadores ). Lo anterior es equivalente a:
bag = (bag + n) - (i + 1) // (string) - (number)... que con suerte puede ver dará resultados diferentes a los de las dos primeras líneas anteriores, ya que ahora está restando cantidades diferentes. Además, como estás usando la resta, tus resultados ahora serán números.
¿Por qué?
Hay una diferencia porque está usando el operador "+" para la concatenación y está usando un "-" en la misma línea, por lo que JS está implícitamente cambiando cadenas y números por usted.
En el ejemplo de bag += n - j + 1 , JS evalúa todo en el lado derecho de izquierda a derecha. Luego, ese número se concatena al final de la cadena denominada bag .
En el ejemplo de bag = bag + n - j + 1 , JS nuevamente evalúa todo en el lado derecho de izquierda a derecha, pero ahora tenemos una mezcla de cadenas y números en el lado derecho, por lo que observa un comportamiento extraño. resultante del antipatrón.
Mira aquí:
bag += n - j + 1 // => bag += 5 - 1 + 1 => bag += 5 => bag = "5" bag = bag + n - j + 1 // => bag = "" + 5 - 1 + 1 => bag = "5" - 1 + 1 => bag = 5En el siguiente ciclo, con la segunda sintaxis, agregará un número en lugar de concatenar una cadena, que es lo que está causando su problema.
Solución
Para solucionar esto, técnicamente puede mantener la primera sintaxis, o puede encerrar los números entre paréntesis, así: bag = bag + (n - j + 1) , pero recomendaría considerar hacer sus moldes explícitos, como bag += String(n - j + 1) o bag = bag.concat(n - j + 1) y evite mezclar tipos de datos para garantizar que errores como estos no vuelvan a surgir.