I actually find all of the return values reasonable.
As you said,
undefined == I just don’t know what the value is
null == I know that there isn’t supposed to be a value here.
As you said,
undefined == I just don’t know what the value is
null == I know that there isn’t supposed to be a value here.
In 10 years I’ve never come across a situation where I found that distinction useful.
Null should mean in most cases that the data you wanted to access was invalid, but you can expect it to exist there in other circumstances.
Neither are a guarantee in JS, and you can find counterexamples for the counterexamples of the counterexamples, but that's the intention behind each.