Edit: Par souci de simplicité, pensez au code suivant:

var z = {x: 1, y: 1};

console.log(z.x+5 + ' ' + z.y+5);

Pourquoi la sortie est (6,15) au lieu de (6,6)?

Avant l'édition: j'ai la fonction suivante:

function findPath(startX, startY, goalX, goalY){
    var queue = [],
        candidates = [],
        path = [];

    queue.push({x: startX, y: startY, searchDistance: 0, hasBeenSearched: true});

    fillQueue();

    function fillQueue(){
  setInnerHTML(queue[0].x, queue[0].y, '.');
        for(var i=-1; i<=1; i++){
            if(queue[0].x + i < 0 || queue[0].x + i >  boardHeight - 1){
                continue;
            }

            for(var j=-1; j<=1; j++){

                if(queue[0].y + j < 0 || queue[0].y + j > boardWidth - 1){
                    continue;
                }
                if(i == 0 && j == 0){
                    continue;
                }
                if(cells[queue[0].x + i][queue[0].y + j].type.blockMovement == true || findCell(queue[0].x + i, queue[0].y + j).hasBeenSearched == true){
                    console.log(queue[0].x + i + ' ' +  queue[0].y + j)
                    continue;
                }

                if((queue[0].x + i == goalX) && (queue[0].y + j == goalY)){
        setInnerHTML(queue[0].x + i, queue[0].y + j, '.');
                    candidates.push(queue[0]);
                    candidates.push({x: queue[0].x + i, y:  queue[0].y + j, searchDistance: queue[0].searchDistance + 1, hasBeenSearched: true});
                    //fillPath();
                    return path;
                }

                queue.push({x: queue[0].x + i, y: queue[0].y + j, searchDistance: queue[0].searchDistance + 1, hasBeenSearched: true}); 

            }
        }

        candidates.push(queue.shift());

        if(queue.length > 0){
            setTimeout(fillQueue, 0);
        }else{
            return 'no path found';
        }

        function findCell(x,y){
            for(var i=0; i<queue.length; i++){
                if(queue[i].x == x && queue[i].y == y){
                    return queue[i];
                }else if(i == queue.length - 1 && (queue[i].x != x || queue[i].y != y)){
                    return {hasBeenSearched: false};
                }
            }
        }
    }
}

Cela fait partie de l'algorithme de recherche de chemin que j'ai réécrit récemment et j'ai le problème suivant. À l'intérieur de la boucle interne, lorsque cette condition findCell(queue[0].x + i, queue[0].y + j).hasBeenSearched == true est vérifiée, les valeurs du deuxième paramètre queue[0].y et j sont concaténées au lieu d'être simplement ajoutées, tandis que la même condition pour le premier paramètre fonctionne correctement (valeurs y sont ajoutés). J'essaie de comprendre cela depuis plusieurs heures maintenant et je n'ai aucune idée de ce qui se passe. Les valeurs queue[0].y et j sont des nombres (je les ai vérifiées en consignant la console typeof) et doivent être ajoutées comme des valeurs similaires dans le premier paramètre. Toute aide pour me signaler ce que j'ai fait de mal sera appréciée. Merci d'avance.

Lien Codepen: http://codepen.io/Furmanus/pen/LkXVwO/?editors= 0011

0
Furman 7 août 2016 à 21:16

3 réponses

Meilleure réponse

Les expressions JS sont évaluées de gauche à droite. Au moment où il atteint ce dernier +, il évalue ('6 1' + 5).

Mettez la dernière partie entre parenthèses pour la forcer à être évaluée séparément: console.log(z.x+5 + ' ' + (z.y+5)).

Vous pouvez également enregistrer plusieurs éléments à l'aide de parenthèses, ce qui évitera ce problème: console.log(z.x+5, z.y+5).

3
Scimonster 7 août 2016 à 18:34

En fait, les arguments de la fonction findCell() sont toujours des nombres.

Le seul endroit où il y a une chaîne est:

console.log(queue[0].x + i + ' ' +  queue[0].y + j)

Cela imprime une chaîne car la somme est calculée de gauche à droite.

Faisons-le étape par étape:

  1. queue [0] .x + i sont deux nombres, et ils sont additionnés, et ils produisent un nombre (appelons-le xi

Alors maintenant, notre opération est:

console.log(xi + ' ' +  queue[0].y + j)
  1. xi est un nombre et il est additionné à ' ' qui est une chaîne. Ils produisent une chaîne (c'est ainsi que JS fait le casting)

À partir de là, vous additionnez les chaînes et les nombres, donc tout d'abord queue[0].y est converti en chaîne et concaténé, puis j est également converti en chaîne et concaténé de la même manière.

La solution est de forcer la priorité des opérateurs:

console.log(queue[0].x + i + ' ' +  (queue[0].y + j))

TL; DR : le code est bon, juste le console.log est cassé

1
rpadovani 7 août 2016 à 18:34

Lorsque vous concaténez les deux valeurs, la seconde est convertie en chaîne.

Utilisez plutôt:

var z = {x: 1, y: 1};
console.log(z.x+5 + ' ' + parseInt(z.y+5));

jsfiddle

0
ron tornambe 7 août 2016 à 18:34