2016-08-07 9 views
0

bearbeiten verketten: Aus Gründen der Einfachheit halber betrachten folgenden Code:Werte innerhalb wenn Bedingung

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

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

Warum ausgegeben (6,15) anstelle von (6,6)?

Vor edit: Ich habe folgende Funktion:

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}; 
       } 
      } 
     } 
    } 
} 

Es ist Teil der Wegfindung Algorithmus Ich habe in letzter Zeit Umschreiben und ich habe folgendes Problem. Innerhalb der inneren for-Schleife, wenn diese Bedingung findCell(queue[0].x + i, queue[0].y + j).hasBeenSearched == true geprüft wird, werden die Werte des zweiten Parameters queue[0].y und j verkettet, anstatt nur hinzugefügt zu werden, während die gleiche Bedingung für den ersten Parameter korrekt funktioniert (Werte werden hinzugefügt). Ich versuche das jetzt für einige Stunden herauszufinden und ich habe keine Ahnung, was hier vor sich geht. Die beiden Werte queue[0].y und j sind Zahlen (ich habe sie mit der Konsolenprotokollierung typeof überprüft) und sollte genau wie ähnliche Werte im ersten Parameter hinzugefügt werden. Jede Hilfe mit dem Hinweis, was ich falsch gemacht habe, wird geschätzt. Vielen Dank im Voraus.

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

Antwort

3

JS Ausdrücke werden von links nach rechts ausgewertet. Bis es die letzte + erreicht, wertet es ('6 1' + 5) aus.

Den letzten Teil in Klammern setzen, um eine separate Auswertung zu erzwingen: console.log(z.x+5 + ' ' + (z.y+5)).

Sie können auch mehrere Dinge mit Klammern protokollieren, wodurch dieses Problem vermieden wird: console.log(z.x+5, z.y+5).

+0

Es war nicht genau die Antwort, die ich erwartet hatte, aber es ist eine gute und richtige Antwort - ich habe nur eine falsche Frage gestellt. Der Code war in der Tat kaputt und es war an einem Ort kaputt, den ich nicht erwartet hatte - jedenfalls habe ich noch etwas Neues gelernt! Also danke für die Antwort :) – Furman

1

Eigentlich sind die Argumente der findCell() Funktion sind immer Zahlen.

Der einzige Ort, wo es eine Zeichenfolge ist:

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

Dieses eine Zeichenfolge druckt, da Summe berechnet wird von links nach rechts.

wir es Schritt für Schritt tun:

  1. Warteschlange [0] .x + i sind zwei Zahlen, und sie werden summiert, und sie oroduces eine Nummer (nennen wir es xi

so, jetzt unser Betrieb ist:

console.log(xi + ' ' + queue[0].y + j) 
  1. xi ist eine Zahl, und es wird summiert, um ' ' ist eine Zeichenfolge. Sie produzieren einen String (das ist, wie JS tut Gießen)

Von hier an Sie summieren Strings und Zahlen, so allererst queue[0].y bespannen gegossen wird, und es ist verketteten, dann j zu bespannen gegossen wird und auf die gleiche Weise verkettet.

Lösung ist es, den Vorrang von Operatoren zu erzwingen:

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

TL; DR: Der Code ist gut, nur die console.log gebrochen

+0

Nein, 'console.log' ist in Ordnung; Der Code ist kaputt. Es macht genau das, was es tun soll. – Scimonster

0

Wenn Sie die beiden Werte verketten, wird der zweite in eine Zeichenfolge konvertiert.

Verwenden Sie stattdessen:

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

jsfiddle