2017-05-01 67 views
0

我已成功訪問使用for循環和eval函數不同的陣列和它們的元素,如下所示:使用eval函數來訪問陣列

var Array1 = [A,B,C,D]; 
var Array2 = [D,B,C,A]; 
var Array3 = [B,C,A,D]; 
var Array4 = [A,D,B,C]; 

for(var row = 1; row <=4; row++){ 
    for(var column = 0; column <=3; column++){ 
    if(row<4 && eval("Array" + row)[column] == eval("Array" + (row +1))[column]){ 
     console.log("Value of Array" + row + "column" + column + "is equal to" + "value of Array" + eval(row + 1) + "column" + column + "\n"); 
    } 
    } 
} 

我的問題是,我在正確使用eval功能。如果它不是使用eval函數的正確方法,那麼如何在不使用eval函數的情況下動態訪問for循環中的不同數組?

+0

如果使用數組的數組是什麼?動態訪問名稱通常是需要別的東西的標誌。 – Li357

+0

你可以將數組包裝在一個對象中,而不是使用'eval'來訪問它的屬性,如'wrappedObject ['Array'+ row]'。 – Saravana

+1

*「我是否正確使用eval函數」* - 「正確」是什麼意思?這是有效的語法,它的工作原理,所以「是」。但是,構建代碼會更好(也很容易!),因此根本不需要'eval()',所以「否」。 – nnnnnn

回答

1

像這樣使用eval雖然它可能工作,但這是一個壞主意,並且使得編寫危險代碼變得非常容易。由於eval將執行其論證,而不管實際傳遞的是什麼,所以導致傳遞錯誤參數的錯誤會比如果您不使用eval更嚴重。 this SO question的答案提供了更多的見解。相反,考慮使用數組的對象:

var arrays = { 
    Array1: [A,B,C,D], 
    Array2: [D,B,C,A], 
    Array3: [B,C,A,D], 
    Array4: [A,D,B,C] 
} 

for(var row = 1; row <=4; row++){ 
    for(var column = 0; column <=3; column++){ 
    if(row<4 && arrays["Array" + row][column] == arrays["Array" + (row + 1)][column]){ 
     console.log("Value of Array" + row + "column" + column + "is equal to" + "value of Array" + (row + 1) + "column" + column + "\n"); 
    } 
    } 
} 
+0

*「使用'eval'就像這樣......編寫危險代碼非常容易」* - 爲什麼它會很危險?我同意這不是一個好主意,但使用「像這樣」並不是很危險。 – nnnnnn

+0

@nnnnnn傳遞給它的參數可能會因爲錯誤而導致無法執行變形代碼,從而可能最終成爲您期望以外的內容。通常情況下,像這樣的錯誤可能會創建一個異常,使用'eval'它可能會導致各種意外行爲。在這個特定的情況下,它可能並不那麼糟糕,但潛力肯定存在。 – Hydrothermal

1

我不會說使用eval這樣是一個好主意。 eval非常難以使用,因爲它很難調試,並且可以用大多數情況下更容易理解的東西替換。它有有效的用例,但這不是其中之一。

使用數組的數組來代替:

var A = 2, B = 2, C = 3, D = 4; 

var grid = [ 
    [A,B,C,D], 
    [D,B,C,A], 
    [B,C,A,D], 
    [A,D,B,C] 
] 

for (var row = 0; row < grid.length; row++) { 
    for (var column = 0; column < grid[0].length; column++) { 
     if (row + 1 < grid.length && grid[row][column] === grid[row + 1][column]) { 
      // they're equal 
     } 
    } 
}