JavaScript is a dynamic language with unique ways of representing the absence of a value. Understanding the nuances between null, undefined, and empty strings ("") is essential for writing robust code. Let’s delve into these concepts and how they differ.

Null
null is a special keyword in JavaScript that represents the intentional absence of any object value. It is often used to explicitly indicate that a variable should have no value or no reference to any object. Although null is considered a primitive value, due to a historical bug in JavaScript, the typeof operator incorrectly returns "object" instead of "null".
Here’s an example of assigning null:
const myVariable = null;
console.log(myVariable); // Output: null
Undefined
undefined occurs when a variable has been declared but has not yet been assigned a value. Unlike null, which is an assignment value, undefined arises naturally in the language without explicit assignment. A function without a return statement implicitly returns undefined if no other return value is provided.
const myVariable;
console.log(myVariable); // Output: undefined
Empty String ("")
An empty string is a string with zero characters. While it might seem similar to null or undefined, it is a valid value and can be explicitly assigned to a variable. It is considered truthy when evaluated in a boolean context.
Here’s an example of an empty string:
const myString = "";
console.log(myString); // Output: ""
Comparison and Arithmetic Operations
Interestingly, null and undefined are loosely equal (null == undefined), which means they are considered equal in comparisons using the loose equality operator (==). However, they are strictly unequal (null !== undefined), meaning they are not considered equal in comparisons using the strict equality operator (===). This is because null and undefined are different types—null is an object, and undefined is a primitive type.
Arithmetic operations behave differently with null and undefined. When null is involved in an arithmetic operation, it is coerced to 0, whereas undefined results in NaN (Not a Number)
console.log(null + 1); // Output: 1
console.log(undefined + 1); // Output: NaN
Conclusion
Understanding the subtle differences between null, undefined, and empty strings in JavaScript is crucial for avoiding bugs and writing clear, predictable code. Each serves a specific purpose in the language: null for intentional absence of an object value, undefined for uninitialized variables, and empty strings for cases where a string value is required but empty.