2016-08-07 42 views
0

編輯:爲了簡單起見,考慮下面的代碼:值串聯內如果條件

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

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

爲什麼輸出是(6,15),而不是(6,6)?

編輯前:我有以下功能:

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

這是尋路算法我最近重寫和我有以下問題的一部分。在內部for循環中,當檢查此條件findCell(queue[0].x + i, queue[0].y + j).hasBeenSearched == true時,第二個參數queue[0].yj的值將被連接而不是僅僅被添加,而第一個參數的相同條件正常工作(添加的值)。我試圖找出現在幾個小時,我不知道發生了什麼。這兩個值queue[0].yj都是數字(我通過控制檯日誌記錄typeof對其進行了檢查),並且應該像第一個參數中的類似值一樣添加。任何幫助指出我做錯了什麼將不勝感激。先謝謝你。

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

回答

3

JS表達式求值從左向右。到達最後的+時,它正在評估('6 1' + 5)

將括號中的最後一部分強制爲單獨評估:console.log(z.x+5 + ' ' + (z.y+5))

您還可以使用圓括號記錄多個事物,這將避免此問題:console.log(z.x+5, z.y+5)

+0

這並不完全是我期待的答案,但它是好的和正確的答案 - 我只是問了錯誤的問題。代碼確實被打破了,它在一個我沒有預料到的地方被打破了 - 無論如何,我仍然學到了新的東西!所以謝謝你的回答:) – Furman

1

實際上,findCell()函數的參數總是號。

那裏是一個字符串是唯一的地方:

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

因爲從左至右總和計算此打印字符串。

讓我們做一步一步來:

  1. 隊列[0] .X +我有兩個數字,它們相加,他們oroduces一些(我們稱之爲xi

因此,現在我們的操作是:

console.log(xi + ' ' + queue[0].y + j) 
  • xi數值,並且它求和以' '這是一個字符串。他們生產的字符串(這是JS怎麼做鑄造)
  • 從這裏開始,你總結字符串和數字,所以首先queue[0].y被強制轉換爲字符串,並將其鏈接起來,然後j被強制轉換爲字符串也和以相同的方式連接。

    解決辦法是強制符的優先級:

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

    TL; DR:代碼是好的,只是console.log被打破

    +0

    沒有,'console.log'是好的;代碼被破壞。它正在做它應該做的事情。 – Scimonster

    0

    當您連接兩個值時,第二個將轉換爲字符串。

    相反,使用:

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

    jsfiddle