访问对象不存在的属性时返回undefined,因原型链查找无匹配而自然终止;该值非主动赋值,而是未命中结果,与显式赋值undefined有本质区别。

当访问一个对象上不存在的属性时,JavaScript 会沿着原型链逐级向上查找;如果整条链都找不到该属性,最终返回 undefined。这不是某个“默认兜底逻辑”主动赋值的结果,而是属性访问算法自然终止后的返回值。
原型链查找过程是隐式的、自动的
每次你写 obj.prop,引擎就会:
- 先检查
obj自身是否拥有prop(即Object.prototype.hasOwnProperty.call(obj, 'prop')为 true) - 如果没有,就去读取
obj.__proto__(即Object.getPrototypeOf(obj)),在该对象上查找prop - 如果还没找到,继续查
obj.__proto__.__proto__,依此类推 - 直到遇到
null(即Object.prototype.__proto__ === null),停止查找 - 此时没有匹配到任何属性,表达式结果就是
undefined
Object.prototype 是原型链终点
几乎所有普通对象的原型链最终都会到达 Object.prototype。它本身没有原型(Object.prototype.__proto__ 是 null),也没有定义你访问的那个属性,所以查找失败。
例如:
立即学习“Java免费学习笔记(深入)”;
const obj = {};console.log(obj.nonExistent); // undefined
// 查找路径:obj → Object.prototype → null(结束)
注意:undefined 不是“被设置”的,而是“未命中”的结果
这和手动写 obj.prop = undefined 有本质区别:
- 前者是**属性访问操作无结果**,不改变对象状态,也不触发 setter
- 后者是**显式赋值**,会在
obj上创建一个值为undefined的自有属性 - 可通过
obj.hasOwnProperty('prop')区分:前者返回false,后者返回true
特殊情况:拦截与覆盖会影响这个行为
以下情况会让访问未定义属性不返回 undefined:
- 对象设置了
get访问器(getter),且该 getter 返回其他值 - 使用
Proxy拦截get,自定义返回逻辑 - 原型链上某一级定义了同名属性(哪怕值是
undefined),也会提前返回,不再继续向上找


















