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

use*_*001 0 javascript undefined web

所以有没有办法检查对象属性是否已正式声明vs?例如...

var obj={};

console.log( non_existent_variable ) //throws not defined error
console.log( obj.non_existent_property) //no error,===undefined
Run Code Online (Sandbox Code Playgroud)

考虑以下...

 function m(){
   this.prop;
 }
 var MyObj=new m();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为已经正式声明的MyObj.prop和没有正确声明的MyObj.non_existent_property之间应该有明显的区别.

不幸的是,它们都是=== undefined,都使用hasOwnProperty返回false,并且都没有在for(in)循环中枚举.我缺少什么?

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

Cᴏʀ*_*ᴏʀʏ 8

在这两个你的例子,属性还没有被"正式宣布".你必须分配一些东西,即使你做的是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
Run Code Online (Sandbox Code Playgroud)

来自MDN:

在执行分配给它们的代码之前,不存在未声明的变量.