如何区分未声明和未定义的 JavaScript 对象属性?

How to tell the difference between undeclared and undefined JavaScript object properties?

那么有没有办法检查对象 属性 是否已经正式声明?例如...

var obj={};

console.log( non_existent_variable ) //throws not defined error
console.log( obj.non_existent_property) //no error,===undefined

考虑以下...

 function m(){
   this.prop;
 }
 var MyObj=new m();

在这种情况下,我认为已经正式宣布的 MyObj.prop 和尚未正式宣布的 MyObj.non_existent_property 之间应该存在可知的区别。

不幸的是,它们都 ===undefined,return 对于 hasOwnProperty 都是 false,并且都没有在 for(in) 循环中被枚举。 有什么我想念的吗?

(恕我直言,为什么解析器不能将已声明但未设置的属性设置为 null? 那会有什么危害?)

初始化为null,那你就有区别了

在您的两个示例中,属性 而不是 "formally declared"。你必须分配一些东西,即使你所做的是 undefined:

function MyObject() {
    this.m = undefined; 
}

var sampleMyObject = new MyObject();

console.log(sampleMyObject.m); // undefined
console.log(sampleMyObject.hasOwnProperty('m')); // true
console.log('m' in sampleMyObject); // true

来自MDN

Undeclared variables do not exist until the code assigning to them is executed.