JavaScript – 确定一个属性是否被定义,并设置为“未定义”,或者是未定义的

说我有以下代码:

function One() {} One.prototype.x = undefined; function Two() {} var o = new One(); var t = new Two(); 

oxtx都将评估为undefinedo.hasOwnProperty('x')t.hasOwnProperty('x')将返回false; propertyIsEnumerable也是一样。 两个问题:

  • 有什么办法可以告诉牛被定义并设置为undefined
  • 有没有任何理由? (如果两者在语义上相同?)

一个小小的警告:做(在o中的propName)循环会产生“x”作为其中一个string,而在t中做它不会 – 所以它们在内部performance如何(至less在Chrome中)有所不同。

比你的方法稍微简单的方法是在运算符中使用Javascript

 alert('x' in o); // true alert('x' in t); // false 

object.hasOwnProperty(name)仅对同一对象中的对象返回true,对于其他所有对象(包括原型中的属性)则返回false。

 function x() { this.another=undefined; }; x.prototype.something=1; x.prototype.nothing=undefined; y = new x; y.hasOwnProperty("something"); //false y.hasOwnProperty("nothing"); //false y.hasOwnProperty("another"); //true "someting" in y; //true "another" in y; //true 

另外删除一个属性的唯一方法是使用delete。 设置为undefined不要删除它。

这样做的正确方法就是像罗博格说的那样使用。

更新: undefined是一个原始值,参见ECMAScript语言规范第4.3.2和4.3.9节。

Ach,一个用于反模式的线程。

undefined不是关键字。

当你分配写var foo = undefined; 你正在给它赋值undefined的符号的值,因此你将得到的值是"undefined" 。 如果您已将其分配给UnDeFiNeDNotFineAtAll_qwertyuiop则会产生完全相同的结果

为什么这么糟糕? 除了导致对错误理解的事实之外,如果你碰巧加载了一个库或者雇佣了一个编写var undefined = true;的开发者,会发生什么var undefined = true;

像这样的东西?

 function isDefined(var){ return (typeof(window[var]) == 'undefined') ? false : true; } 

要么..

 function isDefined(var){ return (window.var === undefined) ? false : true; } 

不,我不认为一个等于undefined的variables应该被认为是“定义的”。

直接将其设置为undefined只是一种懒惰的删除方式 – 就像使用delete关键字一样。 我相信这只是意味着垃圾回收没有影响variables/属性。


[ 编辑 ]

关于您对hasOwnPropertypropertyIsEnumerable评论,原型方法/属性既不是对象本身,也不是可枚举对象。

 Object.prototype.foo = 'something'; var o = {bar: 'anything'}; o.hasOwnProperty('foo'); //=> false o.hasOwnProperty('bar'); //=> true Object.prototype.hasOwnProperty('foo'); //=> true 

一种方法是这样的:

 var definedProperties = []; for (var prop in o) definedProperties.push(prop); if (ox === undefined && contains(prop, 'x')) { //x is defined, but set to undefined } 

其中contains只是检查数组中'x'任何元素是否是'x' 。 这是唯一的方法吗?

您可以尝试在One.x上进行观察,但那只会告诉您当时未定义。