40

假设我有以下代码:

function One() {}
One.prototype.x = undefined;

function Two() {}

var o = new One();
var t = new Two();

o.x并且t.x都将评估为undefined. o.hasOwnProperty('x')并且t.hasOwnProperty('x')都将返回false;也是如此propertyIsEnumerable。两个问题:

  • 有没有办法告诉 ox 已定义并设置为undefined
  • 有任何理由吗?(两者在语义上应该是等价的吗?)

一个小警告:执行 (for propName in o) 循环将产生 'x' 作为字符串之一,而在 t 中执行不会 - 因此它们在内部的表示方式存在差异(至少在 Chrome 中)。

4

7 回答 7

70

比您的方法稍微简单的方法是使用Javascript in 运算符

alert('x' in o); // true
alert('x' in t); // false
于 2008-12-22T10:50:09.853 回答
8

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

此外,删除属性的唯一方法是使用删除。将其设置为未定义不要删除它。

正确的做法是像roborg所说的那样使用in 。

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

于 2008-12-22T10:57:46.497 回答
4

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

undefined不是关键字。

当您分配 write 时,您正在为它分配您尚未定义var foo = undefined;的符号的值,因此您将获得的值是. 如果您分配了它,您将产生完全相同的结果,或者undefined"undefined"UnDeFiNeDNotFineAtAll_qwertyuiop

为什么会如此可怕?除了它会导致对正在发生的事情的错误理解之外,如果你碰巧加载了一个库或雇佣了一个编写的开发人员会发生什么var undefined = true;

于 2008-12-22T11:24:40.187 回答
1

像这样的东西?

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

或者..

function isDefined(var){
   return (window.var === undefined) ? false : true;
}
于 2008-12-22T10:40:50.493 回答
1

不,我不认为等于的变量undefined应该被识别为“已定义”。

直接将其设置为等于undefined只是一种删除它的懒惰方式——与使用delete关键字相反。我相信这只是意味着垃圾收集没有对变量/属性产生影响。


[编辑]

关于您对hasOwnPropertyand的评论propertyIsEnumerable,原型方法/属性既不是对象自己的,也不是可枚举的。

Object.prototype.foo = 'something';

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

Object.prototype.hasOwnProperty('foo');  //=> true
于 2008-12-22T10:45:22.827 回答
0

一种方法是:

var definedProperties = [];
for (var prop in o) definedProperties.push(prop);

if (o.x === undefined && contains(prop, 'x')) {
    //x is defined, but set to undefined
}

wherecontains只检查数组中的任何元素是否为'x'. 这是唯一的方法吗?

于 2008-12-22T10:39:20.060 回答
0

您可以尝试在 One.x 上放置手表,但这只会在未定义时告诉您。

于 2008-12-22T10:39:23.743 回答