That's just how the language works. Its object-based approach is very flexible, and you can dynamically add, update, and remove properties from objects at runtime. Accessing one that is currently not existing should yield undefined
instead of raising an exception. This, for example, allows checking for existence and type in a single expression:
if (prop in obj && typeof obj[prop] == "function") obj[prop]();
// can be written shorter:
if (typeof obj[prop] == "function") obj[prop]();
You can get the value without using it. Using undefined
then will throw in most circumstances.
In contrast, variables are declared statically in their scope. Accessing an undeclared variable is always an error, which legitimates throwing ReferenceError
s.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…