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



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

当订单更改为以下订单时,我会收到TypeError: Cannot read property 'length' of undefined

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

在 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));

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

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

当订单以不同方式编写时,是什么导致了类型错误?

查看您的状况:

col === maze[row].length || row < 0 || col < 0 || row === maze.length

由于逻辑运算是从左到右计算的,因此要计算的第一个运算是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

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

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

请注意,如果您使用的语言不使用

短路计算,那么您将不得不使用多个if语句以正确的顺序运行您的条件:

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

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


希望对您有所帮助!

你需要记住两件事。

  1. Javascript评估是从左到右。
  2. 手术室||运算符短路。这意味着当它第一次遇到真表达式时,它会"短路",即绕过所有其他表达式并只返回一个 true。这是基本的布尔代数。

关于你对TypeError: Cannot read property 'length' of undefined的怀疑,无论是maze[row]还是maze都是不确定的。在运行您的代码片段时,事实证明maze[row]是这里的罪魁祸首。这可能是因为由于您执行了row-1,代码行中的 可能会变为负数,从而导致maze[row]未定义。

如果您将订单转到

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

每当row < 0即负数时,OR操作会使所有其他表达式短路。因此,从不评估maze[row].length,也不会遇到未定义的行为。

相关内容

  • 没有找到相关文章

最新更新