Notion operators have a specific operator precedence order. Operators with a higher precedence (10 being the highest) will have their logic executed before operators of lower precedence.
Operators at the same precedence level are executed either left-to-right or right-to-left, depending on their associativity.
Refer to the table below to see the precedence level and associativity of each operator.
Precedence | Operator Name | Associativity | Symbol |
---|---|---|---|
10 | Parentheses | N/A | () |
9 | Not | right-to-left | not |
8 | Exponentiation (pow) | right-to-left | ^ |
7 | multiply, divide | left-to-right | * , / |
6 | add, subtract | left-to-right | + , - |
5 | Greater than, Greater than or equal, Less than, Less than or equal | N/A | > , >= , < , <= |
4 | unequal, equal | N/A | != , == |
3 | And | left-to-right | and |
2 | Or | left-to-right | or |
1 | Conditional (if) | right-to-left | ... ? ... : ... |
Since parentheses ()
have the highest precedence in a Notion formula, you can use them to define a specific order of operations within any formula.
It’s also good to understand that associativity can be thought of as an implied default setting of parentheses. For example:
/* Multiply has left-to-right associativity. The following are equivalent: */
2 * 3 * 4 /* Output: 24 */
(2 * 3) * 4 /* Output: 24 */
/* Exponentiation has right-to-left associativity (the "Tower Rule"). The following are equivalent: */
2 ^ 3 ^ 2 /* Output: 512 */
2 ^ (3 ^ 2) /* Output: 512 */
Code language: JavaScript (javascript)
Certain operators cannot be chained in Notion formulas; thus, they do not have associativity. These are marked with “N/A” in the associativity column.
For example, the following formulas will not work in Notion:
/* Invalid */
1 > prop("Number") > 5
/* Valid */
1 > prop("Number") and prop("Number") < 5 /* Output: true */
---
/* Invalid */
1 == toNumber(true) == toNumber("1")
/* Valid */
1 == toNumber(true) and 1 == toNumber("1") /* Output: True */
Code language: JavaScript (javascript)
If you want to understand operator precedence and associativity more thoroughly, I’ll recommend reading through the Operator Precedence guide for JavaScript on MDN’s web docs: