在 IF 函数中使用 OR 运算符时,比较条件的顺序是否重要?

pey*_*eyo 1 javascript if-statement or-operator

我试图更好地理解 IF 语句中的条件。当我更改条件的顺序时,我收到未定义的 TypeError。

我收到TypeError: Cannot read property 'length' of undefined时的顺序更改为:

if (col === maze[row].length || row < 0 || col < 0 || row === maze.length) {
    return
}
Run Code Online (Sandbox Code Playgroud)

在 IF 函数中使用 OR 运算符时,比较的顺序是否重要?是什么导致TypeError订单写得不同?

工作代码库:

const maze = [
  [' ', ' ', ' ', '*', ' ', ' ', ' '],
  ['*', '*', ' ', '*', ' ', '*', ' '],
  [' ', ' ', ' ', ' ', ' ', ' ', ' '],
  [' ', '*', '*', '*', '*', '*', ' '],
  [' ', ' ', ' ', ' ', ' ', ' ', 'e'],
];

const solve = (maze, row = 0, col = 0, path = "") => {

  if (row < 0 || col < 0 || row === maze.length || col === maze[row].length) {
    return
  }

  // Base case
  if (maze[row][col] === "e") {
    return console.log(`Solved at (${row}, ${col})! Path to exit: ${path}`)

    // General case
  } else if (maze[row][col] === "*") {
    return
  }

  // Marker
  maze[row][col] = "*"

  // Right
  solve(maze, row, col + 1, path.concat("R"))

  // Down
  solve(maze, row + 1, col, path.concat("D"))

  // Left
  solve(maze, row, col - 1, path.concat("L"))

  // Up
  solve(maze, row - 1, col, path.concat("U"))

  // Remove marker
  maze[row][col] = " "
}

console.log(solve(maze));
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 6

在 IF 语句中使用 OR 运算符时,比较的顺序是否重要?

是的,除了运算符优先级之外,您还需要查看关联性和短路评估。该||运营商已经由左到右的关联性,这意味着它将从计算表达式左到右。短路评估意味着一旦结果已知,将忽略进一步的逻辑条件。

当订单的书写方式不同时,是什么导致了 TypeError?

看你的情况:

col === maze[row].length || row < 0 || col < 0 || row === maze.length
Run Code Online (Sandbox Code Playgroud)

因为逻辑运算是从左到右计算的,所以要计算的第一个是col === maze[row].length。当row === maze.length,然后col === maze[row].length计算为col === undefined.length,这当然会产生错误。

要解决此问题,您需要在首先确认索引不会越界后运行此条件。一个简单的方法是:

row < 0 || col < 0 || row === maze.length || col === maze[row].length
Run Code Online (Sandbox Code Playgroud)

现在,如果前三个条件中的任何一个是true,那么 JavaScript 就不会费心评估其余的条件,因为它已经知道结果是true。正因为如此,它不再崩溃。

(请记住,true || false === true一旦您看到,true ||您甚至不需要阅读表达式的其余部分就知道结果将是true。)


请注意,如果您使用的语言不使用短路评估,那么您将不得不使用多个if语句以正确的顺序运行您的条件:

if (row < 0 || col < 0 || row === maze.length) {
    return
}

if (col === maze[row].length) {
    return
}
Run Code Online (Sandbox Code Playgroud)

我经常发现自己开始编写这样的代码,同时考虑检查需要发生的顺序,然后我将其简化为单个表达式。


希望有帮助!