====== || Logical OR vs ?? Nullish Coalescing vs && Logical AND ====== The **||, ??, and &&** operators are used to perform different types of logical operations. ===== || (Logical OR) ===== The **||** operator returns the **first truthy value** it encounters or the **last value if none are truthy**: const a = 0; const b = 'hello'; const result = a || b; // 'hello' If you want to use || to return a boolean **true or false** value, you can simply convert the result to a boolean. One common way to do this is by using the Boolean constructor, or by using a [[java-script:double-not-operator|double NOT (!!) operator]]: const a = null; // falsy const b = 'value'; // truthy const result = Boolean(a || b); // returns true // Or using the double NOT operator: const resultWithNot = !!(a || b); // also returns true These expressions will evaluate to true if either a or b is truthy, and false otherwise. ===== ?? (Nullish Coalescing) ===== The **??** operator returns the **right-hand operand when the left-hand operand is null or undefined**, and **the left-hand operand otherwise**. \\ It's useful for providing default values: const a = undefined; const b = 'default'; const result = a ?? b; // 'default' ===== && (Logical AND) ===== The **&&** operator returns the **first falsy value** it encounters or the **last value if all are truthy**: const a = 'hello'; const b = 42; const result = a && b; // 42 If you want to use && operator to return a boolean **true or false** value, you can simply convert the result to a boolean: const a = 'hello'; // truthy const b = 42; // truthy const result1 = Boolean(a && b); // true const result2 = Boolean(a) && Boolean(b); // true const result3 = !!a && !!b; //true const result4 = !!(a && b); //true Other example: const value1 = 'hello'; // truthy const value2 = 0; // falsy const result1 = Boolean(value1 && value2); // false const result2 = Boolean(value1) && Boolean(value2); // true && false = false ===== Comparison ===== **||** is generally used for providing a fallback value when dealing with falsy values (**false, 0, empty strings, null, undefined, NaN**). \\ **??** is more specific than || because it only falls back for **null** or **undefined**, not for other falsy values like 0 or an empty string ''. \\ **&&** is used to ensure that multiple conditions are truthy. \\ Example: const value = 0; const fallback1 = 'fallback'; const result1 = value || fallback1; // 'fallback' because 0 is falsy const result2 = value ?? fallback1; // 0 because 0 is not null or undefined const result3 = value && fallback1; // 0 because 0 is the first value, and it's falsy See also [[java-script:bitwise-or-bitwise-and-ternary-optional-chaining-operators|bitwise operators]].