在 IF 函数中使用 OR 运算符时,比较条件的顺序是否重要?
Does the order of the comparison conditions matter when using OR operators in an IF function?
我试图更好地理解 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));
Does the order of the comparisons matter when using OR operators in IF statements?
是的,除了运算符优先级,还需要看associativity and short-circuit evaluation。 ||
运算符具有 从左到右 的结合性,这意味着它将从左到右计算表达式。短路评估意味着一旦结果已知,将忽略进一步的逻辑条件。
What is causing the TypeError when the order is written differently?
看你的情况:
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
}
我经常发现自己开始编写这样的代码时,我会仔细考虑检查需要发生的顺序,然后将其简化为一个表达式。
希望对您有所帮助!
你需要记住两件事。
- Javascript评价是从左到右。
- OR
||
运算符短路。这意味着它第一次遇到一个真实的表达式时 "short-circuits" 即绕过所有其他表达式并且只是 returns 一个真实的。这是基本的布尔代数。
关于您对 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
即负或运算短路所有其他表达式。因此 maze[row].length
永远不会被评估,也不会遇到未定义的行为。
我试图更好地理解 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));
Does the order of the comparisons matter when using OR operators in IF statements?
是的,除了运算符优先级,还需要看associativity and short-circuit evaluation。 ||
运算符具有 从左到右 的结合性,这意味着它将从左到右计算表达式。短路评估意味着一旦结果已知,将忽略进一步的逻辑条件。
What is causing the TypeError when the order is written differently?
看你的情况:
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
}
我经常发现自己开始编写这样的代码时,我会仔细考虑检查需要发生的顺序,然后将其简化为一个表达式。
希望对您有所帮助!
你需要记住两件事。
- Javascript评价是从左到右。
- OR
||
运算符短路。这意味着它第一次遇到一个真实的表达式时 "short-circuits" 即绕过所有其他表达式并且只是 returns 一个真实的。这是基本的布尔代数。
关于您对 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
即负或运算短路所有其他表达式。因此 maze[row].length
永远不会被评估,也不会遇到未定义的行为。